全角半角変換(全角かな→半角カナ、半角カナ→全角カナ)

Java

使い勝手の良いライブラリーを知らないので全角半角変換の処理を書いてみました。
最初にひらがな、全角カタカナ、半角カタカナの変換表を作成していて、各メソッドが変換表を使用して変換処理を行っています。

ひらがなと全角カタカナは文字コードが同じ並びなのでループで回して変換表を作成していますが、全角カタカナと半角カタカナは文字コードの並びが違うのと、「ウィ」は「ヰ」ではなく「ウィ」と変換したいこともあって一つずつ追加しました。

変換表の対応文字は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();
	}
}

コメント

タイトルとURLをコピーしました