package jp.ac.waseda.info.kake.string;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* 文字列内の全角カタカナ・ひらがな変換
*
* @author Tony
*
*/
public abstract class KanaConverter {
// 参考: http://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_3000-3FFF
private static final char start = 'ぁ';
private static final char end = 'ん';
private static final char dist = 'ァ' - 'ぁ';
/**
* 特別に仮名として扱う文字
*/
private static final char[] kana = { 'ー' };
/**
* 特別にカタカナとして扱う文字
*/
private static final char[] katakana = { 'ヴ', 'ヵ', 'ヶ' };
/**
* 特別にひらがなとして扱う文字
*/
private static final char[] hiragana = {};
// TODO ヴ は変換には対応してない。Unicodeには ゔ がある。どうする?文字コード設定をつける?
/**
* 与えた文字列に含まれるひらがなを、全て全角カタカナに変換して返します。
*
* @param str
* @return
*/
public static String getKatakana(String str) {
return convert(str, (char) 0, dist);
}
/**
* 与えた文字がひらがなであれば、全角カタカナに変換して返します。そうでなければ、そのまま返します。
*
* @param ch
* @return
*/
public static char getKatakana(char ch) {
return convertChar(ch, (char) 0, dist);
}
/**
* 与えた文字列に含まれる全角カタカナを、全てひらがなに変換して返します。
*
* @param str
* @return
*/
public static String getHiragana(String str) {
return convert(str, dist, -dist);
}
/**
* 与えた文字が全角カタカナであれば、ひらがなに変換して返します。そうでなければ、そのまま返します。
*
* @param ch
* @return
*/
public static char getHiragana(char ch) {
return convertChar(ch, dist, -dist);
}
/**
* 与えられた文字を、半角から全角へ、あるいは全角から半角へ変換します。
*
* @param from
* @param pos
* ひらがな→カタカナなら0、逆ならdistを指定
* @param plus
* ひらがな→カタカナならdist、逆なら-distを指定
* @return
*/
private static char convertChar(char from, char pos, int plus) {
if (from >= start + pos && from <= end + pos)
return (char) (from + plus);
return from;
}
/**
* 与えられた文字列を、半角から全角へ、あるいは全角から半角へ変換します。
*
* @param from
* @param pos
* ひらがな→カタカナなら0、逆ならdistを指定
* @param plus
* ひらがな→カタカナならdist、逆なら-distを指定
* @return
*/
private static String convert(String from, char pos, int plus) {
if (from == null)
return null;
char[] res = from.toCharArray();
for (int i = 0; i < res.length; i++)
res[i] = convertChar(res[i], pos, plus);
return new String(res);
}
/**
* 文字列内の文字全てがひらがなか特別仮名である場合のみtrueを返します。
*
* @param string
* @return
*/
public static boolean isHiragana(String string) {
for (char ch : string.toCharArray())
if (!isHiragana(ch))
return false;
return true;
}
/**
* 文字列がひらがなか特別仮名を含む場合にtrueを返します。
*
* @param string
* @return
*/
public static boolean containsHiragana(String string) {
for (char ch : string.toCharArray())
if (isHiragana(ch))
return true;
return false;
}
/**
* 文字がひらがなか特別仮名である場合のみtrueを返します。
*
* @param ch
* @return
*/
public static boolean isHiragana(char ch) {
for (char k : kana)
if (k == ch)
return true;
for (char k : hiragana)
if (k == ch)
return true;
return start <= ch && ch <= end;
}
/**
* 文字列内の文字全てがカタカナか特別仮名である場合のみtrueを返します。
*
* @param string
* @return
*/
public static boolean isKatakana(String string) {
for (char ch : string.toCharArray())
if (!isKatakana(ch))
return false;
return true;
}
/**
* 文字列がカタカナか特別仮名を含む場合にtrueを返します。
*
* @param string
* @return
*/
public static boolean containsKatakana(String string) {
for (char ch : string.toCharArray())
if (isKatakana(ch))
return true;
return false;
}
/**
* 文字がカタカナか特別仮名である場合のみtrueを返します。
*
* @param ch
* @return
*/
public static boolean isKatakana(char ch) {
for (char k : kana)
if (k == ch)
return true;
for (char k : katakana)
if (k == ch)
return true;
return start + dist <= ch && ch <= end + dist;
}
/**
* 文字が特別仮名(ひらがなでもカタカナでもある文字)である場合のみtrueを返します。
*
* @param ch
* @return
*/
public static boolean isSpecialCharacter(char ch) {
for (char sp : kana)
if (ch == sp)
return true;
return false;
}
/**
* 文字列が特別仮名(ひらがなでもカタカナでもある文字)を含む場合にtrueを返します。
*
* @param string
* @return
*/
public static boolean containsSpecialCharacter(String string) {
for (char ch : string.toCharArray())
if (isSpecialCharacter(ch))
return true;
return false;
}
/**
* 文字列内の文字全てがひらがなまたはカタカナであればtrueを返します。
*
* @param string
* @return
*/
public static boolean isKana(String string) {
for (char ch : string.toCharArray())
if (!isKana(ch))
return false;
return true;
}
/**
* 指定した文字がひらがなまたはカタカナであればtrueを返します。
*
* @param ch
* @return
*/
public static boolean isKana(char ch) {
return isHiragana(ch) || isKatakana(ch);
}
/**
* 文字列内の文字全てが漢字であればtrueを返します。
*
* @param string
* @return
*/
public static boolean isKanji(String string) {
return string.matches("^[一-龠]*$");
}
/**
* 文字列内に漢字が含まれればtrueを返します。
*
* @param string
* @return
*/
public static boolean containsKanji(String string) {
return string.matches(".*[一-龠].*");
}
/**
* 特別仮名をすべて含んだ配列を返します。
*
* @return
*/
public static char[] getSpecialCharacters() {
return kana.clone();
}
public static void main(String[] args) {
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(System.in));
String input;
while (true) {
System.err.println("変換したい文を入力してください。(空行入力で終了)");
input = reader.readLine();
if (input.length() <= 0)
break;
System.out.println("ひらがな: " + getHiragana(input));
System.out.println("カタカナ: " + getKatakana(input));
System.out.println(containsKanji(input));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}