java将日文半角片假名转成全角的方法

public class StringUtil {

	private static final char[] HANKAKU_KATAKANA = { '。', '「', '」', '、', '・',
			'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ',
			'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ',
			'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ',
			'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル',
			'レ', 'ロ', 'ワ', 'ン', '゙', '゚' };

	private static final char[] ZENKAKU_KATAKANA = { '。', '「', '」', '、', '・',
			'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ',
			'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ',
			'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ',
			'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル',
			'レ', 'ロ', 'ワ', 'ン', '゛', '゜' };

	private static final char HANKAKU_KATAKANA_FIRST_CHAR = HANKAKU_KATAKANA[0];

	private static final char HANKAKU_KATAKANA_LAST_CHAR = HANKAKU_KATAKANA[HANKAKU_KATAKANA.length - 1];

	/**
	 * 半角カタカナから全角カタカナへ変換します。
	 * @param c 変換前の文字
	 * @return 変換後の文字
	 */
	public static char hankakuKatakanaToZenkakuKatakana(char c) {
		if (c >= HANKAKU_KATAKANA_FIRST_CHAR && c <= HANKAKU_KATAKANA_LAST_CHAR) {
			return ZENKAKU_KATAKANA[c - HANKAKU_KATAKANA_FIRST_CHAR];
		} else {
			return c;
		}
	}

	/**
	 * 2文字目が濁点・半濁点で、1文字目に加えることができる場合は、合成した文字を返します。
	 * 合成ができないときは、c1を返します。
	 * @param c1 変換前の1文字目
	 * @param c2 変換前の2文字目
	 * @return 変換後の文字
	 */
	public static char mergeChar(char c1, char c2) {
		if (c2 == '゙') {
			if ("カキクケコサシスセソタチツテトハヒフヘホ".indexOf(c1) > -1) {
				switch (c1) {
				case 'カ':
					return 'ガ';
				case 'キ':
					return 'ギ';
				case 'ク':
					return 'グ';
				case 'ケ':
					return 'ゲ';
				case 'コ':
					return 'ゴ';
				case 'サ':
					return 'ザ';
				case 'シ':
					return 'ジ';
				case 'ス':
					return 'ズ';
				case 'セ':
					return 'ゼ';
				case 'ソ':
					return 'ゾ';
				case 'タ':
					return 'ダ';
				case 'チ':
					return 'ヂ';
				case 'ツ':
					return 'ヅ';
				case 'テ':
					return 'デ';
				case 'ト':
					return 'ド';
				case 'ハ':
					return 'バ';
				case 'ヒ':
					return 'ビ';
				case 'フ':
					return 'ブ';
				case 'ヘ':
					return 'ベ';
				case 'ホ':
					return 'ボ';
				}
			}
		} else if (c2 == '゚') {
			if ("ハヒフヘホ".indexOf(c1) > -1) {
				switch (c1) {
				case 'ハ':
					return 'パ';
				case 'ヒ':
					return 'ピ';
				case 'フ':
					return 'プ';
				case 'ヘ':
					return 'ペ';
				case 'ホ':
					return 'ポ';
				}
			}
		}
		return c1;
	}

	/**
	 *
	 * @param QJstr 変換前の文字目
	 * @return 変換後の文字
	 */
	private static String B2Q(String QJstr) {// 半角-->全角
		String outStr = "";
		String Tstr = "";
		byte[] b = null;

		for (int i = 0; i < QJstr.length(); i++) {
			try {
				Tstr = QJstr.substring(i, i + 1);
				b = Tstr.getBytes("unicode");
			} catch (java.io.UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			if (b[3] == 0) {
				b[2] = (byte) (b[2] - 32);
				b[3] = -1;
				try {
					outStr = outStr + new String(b, "unicode");
				} catch (java.io.UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			} else
				outStr = outStr + Tstr;
		}

		return outStr;
	}

	/**
	 * 文字列中の半角カタカナを全角カタカナに変換します。
	 * @param s 変換前文字列
	 * @return 変換後文字列
	 */
	public static String hankakuKatakanaToZenkakuKatakana(String s) {
		if (s.length() == 0) {
			return s;
		} else {
			s = B2Q(s);
			if (s.length() == 1) {
				return hankakuKatakanaToZenkakuKatakana(s.charAt(0)) + "";
			} else {

				StringBuffer sb = new StringBuffer(s);
				int i = 0;
				for (i = 0; i < sb.length() - 1; i++) {
					char originalChar1 = sb.charAt(i);
					char originalChar2 = sb.charAt(i + 1);
					char margedChar = mergeChar(originalChar1, originalChar2);
					if (margedChar != originalChar1) {
						sb.setCharAt(i, margedChar);
						sb.deleteCharAt(i + 1);
					} else {
						char convertedChar = hankakuKatakanaToZenkakuKatakana(originalChar1);
						if (convertedChar != originalChar1) {
							sb.setCharAt(i, convertedChar);
						}
					}
				}
				if (i < sb.length()) {
					char originalChar1 = sb.charAt(i);
					char convertedChar = hankakuKatakanaToZenkakuKatakana(originalChar1);
					if (convertedChar != originalChar1) {
						sb.setCharAt(i, convertedChar);
					}
				}
				return sb.toString();
			}
		}
	}

	public static void main(String[] args) {
		System.out.println(hankakuKatakanaToZenkakuKatakana("aaバガ123"));
	}
}

  

posted @ 2020-11-10 09:45  蝶花残梦  阅读(315)  评论(0编辑  收藏  举报
Live2D