使い勝手の良いライブラリーを知らないので全角半角変換の処理を書いてみました。
最初にひらがな、全角カタカナ、半角カタカナの変換表を作成していて、各メソッドが変換表を使用して変換処理を行っています。
ひらがなと全角カタカナは文字コードが同じ並びなのでループで回して変換表を作成していますが、全角カタカナと半角カタカナは文字コードの並びが違うのと、「ウィ」は「ヰ」ではなく「ウィ」と変換したいこともあって一つずつ追加しました。
変換表の対応文字はUnicodeの「East Asian Scripts」の「Katakana」の資料などが参考になりました。
https://www.unicode.org/charts/
package sample;
import java.util.HashMap;
import java.util.Map;
public class StringUtils {
private static final Map<String, String> HIRAGANA_KATAKANA_MAP = new HashMap<String, String>() {
{
for (char hiragana = 'ぁ'; hiragana <= 'ゖ'; hiragana++) {
String katakana = String.valueOf((char) (hiragana - 'ぁ' + 'ァ'));
put(String.valueOf(hiragana), katakana);
}
}
};
private static final Map<String, String> FULLWIDTH_KATAKANA_HALFWIDTH_KATAKANA_MAP = new HashMap<String, String>() {
{
put("゛", "゙");
put("゜", "゚");
put("ァ", "ァ");
put("ア", "ア");
put("ィ", "ィ");
put("イ", "イ");
put("ゥ", "ゥ");
put("ウ", "ウ");
put("ェ", "ェ");
put("エ", "エ");
put("ォ", "ォ");
put("オ", "オ");
put("カ", "カ");
put("ガ", "ガ");
put("キ", "キ");
put("ギ", "ギ");
put("ク", "ク");
put("グ", "グ");
put("ケ", "ケ");
put("ゲ", "ゲ");
put("コ", "コ");
put("ゴ", "ゴ");
put("サ", "サ");
put("ザ", "ザ");
put("シ", "シ");
put("ジ", "ジ");
put("ス", "ス");
put("ズ", "ズ");
put("セ", "セ");
put("ゼ", "ゼ");
put("ソ", "ソ");
put("ゾ", "ゾ");
put("タ", "タ");
put("ダ", "ダ");
put("チ", "チ");
put("ヂ", "ヂ");
put("ッ", "ッ");
put("ツ", "ツ");
put("ヅ", "ヅ");
put("テ", "テ");
put("デ", "デ");
put("ト", "ト");
put("ド", "ド");
put("ナ", "ナ");
put("ニ", "ニ");
put("ヌ", "ヌ");
put("ネ", "ネ");
put("ノ", "ノ");
put("ハ", "ハ");
put("バ", "バ");
put("パ", "パ");
put("ヒ", "ヒ");
put("ビ", "ビ");
put("ピ", "ピ");
put("フ", "フ");
put("ブ", "ブ");
put("プ", "プ");
put("ヘ", "ヘ");
put("ベ", "ベ");
put("ペ", "ペ");
put("ホ", "ホ");
put("ボ", "ボ");
put("ポ", "ポ");
put("マ", "マ");
put("ミ", "ミ");
put("ム", "ム");
put("メ", "メ");
put("モ", "モ");
put("ャ", "ャ");
put("ヤ", "ヤ");
put("ュ", "ュ");
put("ユ", "ユ");
put("ョ", "ョ");
put("ヨ", "ヨ");
put("ラ", "ラ");
put("リ", "リ");
put("ル", "ル");
put("レ", "レ");
put("ロ", "ロ");
put("ヮ", "ワ");
put("ワ", "ワ");
put("ヰ", "ウィ");
put("ヱ", "ウェ");
put("ヲ", "ヲ");
put("ン", "ン");
put("ヴ", "ヴ");
put("ヵ", "カ");
put("ヶ", "ケ");
put("ヷ", "ヷ");
put("ヸ", "ヴィ");
put("ヹ", "ヴェ");
put("ヺ", "ヺ");
put("・", "・");
put("ー", "ー");
}
};
private static final Map<String, String> HALFWIDTH_KATAKANA_FULLWIDTH_KATAKANA_MAP = new HashMap<String, String>() {
{
put("・", "・");
put("ヲ", "ヲ");
put("ァ", "ァ");
put("ィ", "ィ");
put("ゥ", "ゥ");
put("ェ", "ェ");
put("ォ", "ォ");
put("ャ", "ャ");
put("ュ", "ュ");
put("ョ", "ョ");
put("ッ", "ッ");
put("ー", "ー");
put("ア", "ア");
put("イ", "イ");
put("ウ", "ウ");
put("エ", "エ");
put("オ", "オ");
put("カ", "カ");
put("ガ", "ガ");
put("キ", "キ");
put("ギ", "ギ");
put("ク", "ク");
put("グ", "グ");
put("ケ", "ケ");
put("ゲ", "ゲ");
put("コ", "コ");
put("ゴ", "ゴ");
put("サ", "サ");
put("ザ", "ザ");
put("シ", "シ");
put("ジ", "ジ");
put("ス", "ス");
put("ズ", "ズ");
put("セ", "セ");
put("ゼ", "ゼ");
put("ソ", "ソ");
put("ゾ", "ゾ");
put("タ", "タ");
put("ダ", "ダ");
put("チ", "チ");
put("ヂ", "ヂ");
put("ツ", "ツ");
put("ヅ", "ヅ");
put("テ", "テ");
put("デ", "デ");
put("ト", "ト");
put("ド", "ド");
put("ナ", "ナ");
put("ニ", "ニ");
put("ヌ", "ヌ");
put("ネ", "ネ");
put("ノ", "ノ");
put("ハ", "ハ");
put("バ", "バ");
put("パ", "パ");
put("ヒ", "ヒ");
put("ビ", "ビ");
put("ピ", "ピ");
put("フ", "フ");
put("ブ", "ブ");
put("プ", "プ");
put("ヘ", "ヘ");
put("ベ", "ベ");
put("ペ", "ペ");
put("ホ", "ホ");
put("ボ", "ボ");
put("ポ", "ポ");
put("マ", "マ");
put("ミ", "ミ");
put("ム", "ム");
put("メ", "メ");
put("モ", "モ");
put("ヤ", "ヤ");
put("ユ", "ユ");
put("ヨ", "ヨ");
put("ラ", "ラ");
put("リ", "リ");
put("ル", "ル");
put("レ", "レ");
put("ロ", "ロ");
put("ワ", "ワ");
put("ン", "ン");
put("゙", "゛");
put("゚", "゜");
put("=", "゠");
put("ヴ", "ヴ");
put("ヷ", "ヷ");
}
};
/**
* 半角カタカナを全角カタカナに変換
*/
public static String hankakuKatakanaToZenkakuKatakana(String s) {
return convert(s, HALFWIDTH_KATAKANA_FULLWIDTH_KATAKANA_MAP);
}
/**
* ひらがなをカタカナへ変換
*/
public static String hiraganaToKatakana(String s) {
return convert(s, HIRAGANA_KATAKANA_MAP);
}
/**
* 半角カタカナに変換
*/
public static String toHankakuKatakana(String s) {
String str = s;
str = hiraganaToKatakana(str);
str = zenkakuKatakanaToHankakuKatakana(str);
return str;
}
/**
* 全角カタカナに変換
*/
public static String toZenkakuKatakana(String s) {
String str = s;
str = hiraganaToKatakana(str);
str = hankakuKatakanaToZenkakuKatakana(str);
return str;
}
/**
* 全角カタカナを半角カタカナに変換
*/
public static String zenkakuKatakanaToHankakuKatakana(String s) {
return convert(s, FULLWIDTH_KATAKANA_HALFWIDTH_KATAKANA_MAP);
}
/**
* 変換処理
*/
private static String convert(String s, Map<String, String> map) {
if (s == null) {
return null;
}
StringBuilder sb = new StringBuilder();
char[] array = s.toCharArray();
for (int i = 0; i < array.length; i++) {
char c1 = array[i];
String key1 = String.valueOf(c1);
String key2 = null;
if ((i + 1) < array.length) {
char c2 = array[i + 1];
key2 = String.valueOf(new char[] { c1, c2 });
}
if (map.containsKey(key2)) {
sb.append(map.get(key2));
i += 1;
} else if (map.containsKey(key1)) {
sb.append(map.get(key1));
} else {
sb.append(c1);
}
}
return sb.toString();
}
}
コメント