全角/半角変換
半角カタカナ/全角カタカナ変換
半角カタカナとして認識するコード範囲は、「0xFF610〜xFF9F」の63文字とします。
全角カタカナとして認識するコード範囲は、「0x30A10〜x30FC」に、「0x3001(,)」、「0x3002(.)」、「0x300C(「)」、「0x300D(」)」、「0x309B(゛)」、「0x309C(゜)」を加えた98文字とします。
半角カタカナと全角カタカナはUnicode表上での出現順序がまったく異なるため、テーブルを使って変換します。
半角カタカナ/全角カタカナ変換テーブル
// 半角カタカナ<-->全角カタカナ変換テーブル
private static final String kanaTbl[][] = {
// 2文字構成の濁点付き半角カナ
// 必ずテーブルに先頭に置いてサーチ順を優先すること
{ "ガ", "ガ" }, { "ギ", "ギ" }, { "グ", "グ" }, { "ゲ", "ゲ" }, { "ゴ", "ゴ" },
{ "ザ", "ザ" }, { "ジ", "ジ" }, { "ズ", "ズ" }, { "ゼ", "ゼ" }, { "ゾ", "ゾ" },
{ "ダ", "ダ" }, { "ヂ", "ヂ" }, { "ヅ", "ヅ" }, { "デ", "デ" }, { "ド", "ド" },
{ "バ", "バ" }, { "ビ", "ビ" }, { "ブ", "ブ" }, { "ベ", "ベ" }, { "ボ", "ボ" },
{ "パ", "パ" }, { "ピ", "ピ" }, { "プ", "プ" }, { "ペ", "ペ" }, { "ポ", "ポ" },
{ "ヴ", "ヴ" },
// 1文字構成の半角カナ
{ "ア", "ア" }, { "イ", "イ" }, { "ウ", "ウ" }, { "エ", "エ" }, { "オ", "オ" },
{ "カ", "カ" }, { "キ", "キ" }, { "ク", "ク" }, { "ケ", "ケ" }, { "コ", "コ" },
{ "サ", "サ" }, { "シ", "シ" }, { "ス", "ス" }, { "セ", "セ" }, { "ソ", "ソ" },
{ "タ", "タ" }, { "チ", "チ" }, { "ツ", "ツ" }, { "テ", "テ" }, { "ト", "ト" },
{ "ナ", "ナ" }, { "ニ", "ニ" }, { "ヌ", "ヌ" }, { "ネ", "ネ" }, { "ノ", "ノ" },
{ "ハ", "ハ" }, { "ヒ", "ヒ" }, { "フ", "フ" }, { "ヘ", "ヘ" }, { "ホ", "ホ" },
{ "マ", "マ" }, { "ミ", "ミ" }, { "ム", "ム" }, { "メ", "メ" }, { "モ", "モ" },
{ "ヤ", "ヤ" }, { "ユ", "ユ" }, { "ヨ", "ヨ" },
{ "ラ", "ラ" }, { "リ", "リ" }, { "ル", "ル" }, { "レ", "レ" }, { "ロ", "ロ" },
{ "ワ", "ワ" }, { "ヲ", "ヲ" }, { "ン", "ン" },
{ "ァ", "ァ" }, { "ィ", "ィ" }, { "ゥ", "ゥ" }, { "ェ", "ェ" }, { "ォ", "ォ" },
{ "ャ", "ャ" }, { "ュ", "ュ" }, { "ョ", "ョ" }, { "ッ", "ッ" },
{ "。", "。" }, { "「", "「" }, { "」", "」" }, { "、", "、" }, { "・", "・" },
{ "ー", "ー" }, { "", "" }
};
半角カタカナ → 全角カタカナ変換
public static String HtoZ_Kkana(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0, j = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode半角カタカナのコード範囲か?
if (c.compareTo(new Character((char)0xff61)) >= 0
&& c.compareTo(new Character((char)0xff9f)) <= 0) {
// 半角全角変換テーブルを検索する
for (j = 0; j < kanaTbl.length; j++) {
if (p.substring(i).startsWith(kanaTbl[j][0])) {
sb.append(kanaTbl[j][1]);
i += kanaTbl[j][0].length() - 1;
break;
}
}
// 検索できなければ、変換しない
if (j >= kanaTbl.length) {
sb.append(c);
}
} else { // Unicode半角カタカナ以外なら変換しない
sb.append(c);
}
}
return sb.toString();
}
全角カタカナ → 半角カタカナ変換
public static String ZtoH_Kkana(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0, j = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode全角カタカナのコード範囲か?
if (c.compareTo(new Character((char)0x30a1)) >= 0
&& c.compareTo(new Character((char)0x30fc)) <= 0) {
// 半角全角変換テーブルを検索する
for (j = 0; j < kanaTbl.length; j++) {
if (p.substring(i).startsWith(kanaTbl[j][1])) {
sb.append(kanaTbl[j][0]);
break;
}
}
// 検索できなければ、変換しない
if (j >= kanaTbl.length) {
sb.append(c);
}
} else { // 全角カタカナ以外なら変換しない
sb.append(c);
}
}
return sb.toString();
}
全角カタカナ/全角ひらがな変換
全角カタカナはUnicodeで「0x30A1〜0x30FF」の84文字、全角ひらがなはUnicodeで「0x3041〜0x3094」の84文字で、1対1に対応します。
変換には、その差分値「0x0060」を加算・減算することによって行います。
全角カタカナ → 全角ひらがな変換
public static String Kkana_Hkana(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode全角カタカナのコード範囲(ァ〜ン)であるか?
if (c.compareTo(new Character((char)0x30a1)) >= 0
&& c.compareTo(new Character((char)0x30f3)) <= 0) {
// 全角カナ文字から0x0060を減算して全角かな文字に変換する
Character x = new Character((char) (c.charValue()
- (new Character((char)0x0060)).charValue()));
sb.append(x);
} else { // 全角カタカナ以外なら変換しない
sb.append(c);
}
}
// 変換後文字列を戻します
return sb.toString();
}
全角ひらがな全角カタカナ → 全角カタカナ変換
public static String Hkana_Kkana(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode全角ひらがなのコード範囲(ぁ〜ん)であるか?
if (c.compareTo(new Character((char)0x3041)) >= 0
&& c.compareTo(new Character((char)0x3093)) <= 0) {
// 全角かな文字に0x0060を加算して全角カナ文字に変換
Character x = new Character((char) (c.charValue()
+ (new Character((char)0x0060)).charValue()));
sb.append(x);
} else { // 全角カタカナ以外なら変換しない
sb.append(c);
}
}
return sb.toString();
}
半角英数字/全角ラテン英数字変換
半角英数字はUnicodeで「0x0021〜0x007E」の94文字、全角英数字はUnicodeで「0xFF01〜0xFF5E」の94文字で、1対1に対応します。
変換には、その差分値「0xFFE0」を加算・減算することによって行います。
半角英数字 → 全角英数字変換
public static String HtoZ_Alpha(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode半角ラテン文字のコード範囲(!〜~)であるか?
if (c.compareTo(new Character((char)0x0021)) >= 0
&& c.compareTo(new Character((char)0x007e)) <= 0) {
// 変換文字に0xfee0を加算して全角文字に変換する
Character x = new Character((char) (c.charValue()
+ (new Character((char)0xfee0)).charValue()));
sb.append(x);
} else { // 半角ラテン文字以外なら変換しない
sb.append(c);
}
}
return sb.toString();
}
全角英数字 → 半角英数字変換
public static String ZtoH_Alpha(String p) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < p.length(); i++) {
Character c = new Character(p.charAt(i));
// Unicode全角ラテン文字のコード範囲(!から〜)であるか?
if (c.compareTo(new Character((char)0xff01)) >= 0
&& c.compareTo(new Character((char)0xff5e)) <= 0) {
// 変換文字から0xfee0を減算して半角文字に変換します
Character x = new Character((char) (c.charValue()
- (new Character((char)0xfee0)).charValue()));
sb.append(x);
} else { // 全角ラテン文字以外なら変換しない
sb.append(c);
}
}
return sb.toString();
}