// $Id$ using System; using System.Text; using System.Text.RegularExpressions; using System.Collections; namespace Misuzilla.Text.JapaneseStringUtilities { public class Converter { private static readonly Hashtable _tableZenkakuToHankaku; private static readonly Char[] _tableHankakuToZenkakuHanDakuten; private static readonly Char[] _tableHankakuToZenkaku; private static readonly Char[,] _tableHankakuToZenkakuDakuten; private Converter() { } static Converter() { _tableZenkakuToHankaku = new Hashtable(); _tableZenkakuToHankaku['。'] = "。"; _tableZenkakuToHankaku['「'] = "「"; _tableZenkakuToHankaku['」'] = "」"; _tableZenkakuToHankaku['、'] = "、"; _tableZenkakuToHankaku['・'] = "・"; _tableZenkakuToHankaku['ヲ'] = "ヲ"; _tableZenkakuToHankaku['ァ'] = "ァ"; _tableZenkakuToHankaku['ィ'] = "ィ"; _tableZenkakuToHankaku['ゥ'] = "ゥ"; _tableZenkakuToHankaku['ェ'] = "ェ"; _tableZenkakuToHankaku['ォ'] = "ォ"; _tableZenkakuToHankaku['ャ'] = "ャ"; _tableZenkakuToHankaku['ュ'] = "ュ"; _tableZenkakuToHankaku['ョ'] = "ョ"; _tableZenkakuToHankaku['ッ'] = "ッ"; _tableZenkakuToHankaku['ー'] = "ー"; _tableZenkakuToHankaku['ア'] = "ア"; _tableZenkakuToHankaku['イ'] = "イ"; _tableZenkakuToHankaku['ウ'] = "ウ"; _tableZenkakuToHankaku['エ'] = "エ"; _tableZenkakuToHankaku['オ'] = "オ"; _tableZenkakuToHankaku['カ'] = "カ"; _tableZenkakuToHankaku['キ'] = "キ"; _tableZenkakuToHankaku['ク'] = "ク"; _tableZenkakuToHankaku['ケ'] = "ケ"; _tableZenkakuToHankaku['コ'] = "コ"; _tableZenkakuToHankaku['サ'] = "サ"; _tableZenkakuToHankaku['シ'] = "シ"; _tableZenkakuToHankaku['ス'] = "ス"; _tableZenkakuToHankaku['セ'] = "セ"; _tableZenkakuToHankaku['ソ'] = "ソ"; _tableZenkakuToHankaku['タ'] = "タ"; _tableZenkakuToHankaku['チ'] = "チ"; _tableZenkakuToHankaku['ツ'] = "ツ"; _tableZenkakuToHankaku['テ'] = "テ"; _tableZenkakuToHankaku['ト'] = "ト"; _tableZenkakuToHankaku['ナ'] = "ナ"; _tableZenkakuToHankaku['ニ'] = "ニ"; _tableZenkakuToHankaku['ヌ'] = "ヌ"; _tableZenkakuToHankaku['ネ'] = "ネ"; _tableZenkakuToHankaku['ノ'] = "ノ"; _tableZenkakuToHankaku['ハ'] = "ハ"; _tableZenkakuToHankaku['ヒ'] = "ヒ"; _tableZenkakuToHankaku['フ'] = "フ"; _tableZenkakuToHankaku['ヘ'] = "ヘ"; _tableZenkakuToHankaku['ホ'] = "ホ"; _tableZenkakuToHankaku['マ'] = "マ"; _tableZenkakuToHankaku['ミ'] = "ミ"; _tableZenkakuToHankaku['ム'] = "ム"; _tableZenkakuToHankaku['メ'] = "メ"; _tableZenkakuToHankaku['モ'] = "モ"; _tableZenkakuToHankaku['ヤ'] = "ヤ"; _tableZenkakuToHankaku['ユ'] = "ユ"; _tableZenkakuToHankaku['ヨ'] = "ヨ"; _tableZenkakuToHankaku['ワ'] = "ワ"; _tableZenkakuToHankaku['ヲ'] = "ヲ"; _tableZenkakuToHankaku['ン'] = "ン"; _tableZenkakuToHankaku['ヴ'] = "ヴ"; _tableZenkakuToHankaku['゛'] = "゙"; _tableZenkakuToHankaku['゜'] = "゚"; _tableZenkakuToHankaku['ガ'] = "ガ"; _tableZenkakuToHankaku['ギ'] = "ギ"; _tableZenkakuToHankaku['グ'] = "グ"; _tableZenkakuToHankaku['ゲ'] = "ゲ"; _tableZenkakuToHankaku['ゴ'] = "ゴ"; _tableZenkakuToHankaku['ザ'] = "ザ"; _tableZenkakuToHankaku['ジ'] = "ジ"; _tableZenkakuToHankaku['ズ'] = "ズ"; _tableZenkakuToHankaku['ゼ'] = "ゼ"; _tableZenkakuToHankaku['ゾ'] = "ゾ"; _tableZenkakuToHankaku['ダ'] = "ダ"; _tableZenkakuToHankaku['ヂ'] = "ヂ"; _tableZenkakuToHankaku['ヅ'] = "ヅ"; _tableZenkakuToHankaku['デ'] = "デ"; _tableZenkakuToHankaku['ド'] = "ド"; _tableZenkakuToHankaku['バ'] = "バ"; _tableZenkakuToHankaku['ビ'] = "ビ"; _tableZenkakuToHankaku['ブ'] = "ブ"; _tableZenkakuToHankaku['ベ'] = "ベ"; _tableZenkakuToHankaku['ボ'] = "ボ"; _tableZenkakuToHankaku['パ'] = "パ"; _tableZenkakuToHankaku['ピ'] = "ピ"; _tableZenkakuToHankaku['プ'] = "プ"; _tableZenkakuToHankaku['ペ'] = "ペ"; _tableZenkakuToHankaku['ポ'] = "ポ"; _tableHankakuToZenkaku = new Char[] { '。', '「', '」', '、', '・', 'ヲ', 'ァ', 'ィ', 'ゥ', 'ェ', 'ォ', 'ャ', 'ュ', 'ョ', 'ッ', 'ー', 'ア', 'イ', 'ウ', 'エ', 'オ', 'カ', 'キ', 'ク', 'ケ', 'コ', 'サ', 'シ', 'ス', 'セ', 'ソ', 'タ', 'チ', 'ツ', 'テ', 'ト', 'ナ', 'ニ', 'ヌ', 'ネ', 'ノ', 'ハ', 'ヒ', 'フ', 'ヘ', 'ホ', 'マ', 'ミ', 'ム', 'メ', 'モ', 'ヤ', 'ユ', 'ヨ', 'ラ', 'リ', 'ル', 'レ', 'ロ', 'ワ', 'ン', '゛', '゜', }; _tableHankakuToZenkakuDakuten = new Char[,] { {' ', ' ', ' ', ' ', ' '}, {'ガ', 'ギ', 'グ', 'ゲ', 'ゴ'}, {'ザ', 'ジ', 'ズ', 'ゼ', 'ゾ'}, {'ダ', 'ヂ', 'ヅ', 'デ', 'ド'}, {' ', ' ', ' ', ' ', ' '}, {'バ', 'ビ', 'ブ', 'ベ', 'ボ'}, }; _tableHankakuToZenkakuHanDakuten = new Char[] { 'パ', 'ピ', 'プ', 'ペ', 'ポ', }; } public static String Convert(String str, ConvertFlags wideFlag, ConvertFlags narrowFlag) { StringBuilder sb = new StringBuilder(); //Console.WriteLine("Convert In: {0}", str); for (Int32 i = 0; i < str.Length; i++) { Char c = str[i]; Boolean isNextDakuten = (str.Length > i+1 ? (str[i+1] == '゙') : false); Boolean isNextHanDakuten = (str.Length > i+1 ? (str[i+1] == '゚') : false); //Console.WriteLine(" - char: {0}", c); //Console.WriteLine(" - isNextDakuten: {0}", isNextDakuten); //Console.WriteLine(" - isNextHanDakuten: {0}", isNextHanDakuten); if (((narrowFlag & ConvertFlags.Katakana) != 0) && _tableZenkakuToHankaku.ContainsKey(c)) { // 全角カナ -> 半角カナ sb.Append(_tableZenkakuToHankaku[c]); } else if (((wideFlag & ConvertFlags.Katakana) != 0) && (c >= '。' && c <= '゚')) { // 半角カナ -> 全角カナ Int32 col = (c - 'ア') / 5; // アカサタナ行 Int32 row = (c - 'ア') % 5; // アイウエオ //Console.WriteLine(" - char: {0} at {1} - {2}", c, col, row); if (isNextDakuten) { switch (col) { case 1: case 2: case 3: case 5: //Console.WriteLine(" -> {0}", _tableHankakuToZenkakuDakuten[col, row]); sb.Append(_tableHankakuToZenkakuDakuten[col, row]); i++; break; default: if (c == 'ウ') { sb.Append('ヴ'); i++; } break; } } else if (isNextHanDakuten && col == 5) { sb.Append(_tableHankakuToZenkakuHanDakuten[row]); i++; } else { //Console.WriteLine(" -> {0}", _tableHankakuToZenkaku[(c - '。')]); sb.Append(_tableHankakuToZenkaku[(c - '。')]); } } else if (((wideFlag & ConvertFlags.Alphabet) != 0) && (c >= '!' && c <= '~' && (c < '0' || c > '9'))) { // 半角アルファベット -> 全角アルファベット sb.Append((Char)('!' + (c - '!'))); } else if (((narrowFlag & ConvertFlags.Alphabet) != 0) && (c >= '!' && c <= '〜' && (c < '0' || c > '9'))) { // 全角アルファベット -> 半角アルファベット sb.Append((Char)('!' + (c - '!'))); } else if (((wideFlag & ConvertFlags.Numeric) != 0) && (c >= '0' && c <= '9')) { // 半角数字 -> 全角数字 sb.Append((Char)('0' + (c - '0'))); } else if (((narrowFlag & ConvertFlags.Numeric) != 0) && (c >= '0' && c <= '9')) { // 全角数字 -> 半角数字 sb.Append((Char)('0' + (c - '0'))); } else if (((wideFlag & ConvertFlags.Space) != 0) && (c == ' ')) { // 半角空白 -> 全角空白 sb.Append(' '); } else if (((narrowFlag & ConvertFlags.Space) != 0) && (c == ' ')) { // 全角空白 -> 半角空白 sb.Append(' '); } else { sb.Append(c); } } return sb.ToString(); } } [Flags] public enum ConvertFlags { None = 0x0000, Katakana = 0x0001, Numeric = 0x0002, Alphabet = 0x0004, AlphaNumeric = Numeric | Alphabet, Space = 0x0008, All = Katakana | AlphaNumeric | Space } }