追記20130515
ローマ字→ひらがな変換関数を三年ぶりに改善した - c4se記:さっちゃんですよ☆ http://c4se.hatenablog.com/entry/2013/05/16/060231
ほんとはもっと大きなプログラム書いてるんだけど、其のほんの一部を、過去の記事への補足として。
ローマ字→平仮名の表 #javascript - c4se記 - http://d.hatena.ne.jp/Kureduki_Maari/20100210/1265741074
を書いたけど、此の表丈じゃ使えない。
其所で、roman -> hiraganaに正しく変換する関数を書きました。「正しく」変換する。
// License: Public Domain var roman2hiragana = { 'a':'あ', 'i':'い', 'u':'う', 'e':'え', 'o':'お', 'ka':'か', 'ki':'き', 'ku':'く', 'ke':'け', 'ko':'こ', 'sa':'さ', 'si':'し', 'su':'す', 'se':'せ', 'so':'そ', 'ta':'た', 'ti':'ち', 'tu':'つ', 'te':'て', 'to':'と', 'chi':'ち', 'tsu':'つ', 'na':'な', 'ni':'に', 'nu':'ぬ', 'ne':'ね', 'no':'の', 'ha':'は', 'hi':'ひ', 'hu':'ふ', 'he':'へ', 'ho':'ほ', 'fu':'ふ', 'ma':'ま', 'mi':'み', 'mu':'む', 'me':'め', 'mo':'も', 'ya':'や', 'yi':'い', 'yu':'ゆ', 'ye':'いぇ', 'yo':'よ', 'ra':'ら', 'ri':'り', 'ru':'る', 're':'れ', 'ro':'ろ', 'wa':'わ', 'wyi':'ゐ', 'wu':'う', 'wye':'ゑ', 'wo':'を', 'nn':'ん', 'ga':'が', 'gi':'ぎ', 'gu':'ぐ', 'ge':'げ', 'go':'ご', 'za':'ざ', 'zi':'じ', 'zu':'ず', 'ze':'ぜ', 'zo':'ぞ', 'ji':'じ', 'da':'だ', 'di':'ぢ', 'du':'づ', 'de':'で', 'do':'ど', 'ba':'ば', 'bi':'び', 'bu':'ぶ', 'be':'べ', 'bo':'ぼ', 'pa':'ぱ', 'pi':'ぴ', 'pu':'ぷ', 'pe':'ぺ', 'po':'ぽ', 'kya':'きゃ', 'kyu':'きゅ', 'kyo':'きょ', 'sya':'しゃ', 'syu':'しゅ', 'syo':'しょ', 'tya':'ちゃ', 'tyi':'ちぃ', 'tyu':'ちゅ', 'tye':'ちぇ', 'tyo':'ちょ', 'cha':'ちゃ', 'chu':'ちゅ', 'che':'ちぇ', 'cho':'ちょ', 'nya':'にゃ', 'nyi':'にぃ', 'nyu':'にゅ', 'nye':'にぇ', 'nyo':'にょ', 'hya':'ひゃ', 'hyi':'ひぃ', 'hyu':'ひゅ', 'hye':'ひぇ', 'hyo':'ひょ', 'mya':'みゃ', 'myi':'みぃ', 'myu':'みゅ', 'mye':'みぇ', 'myo':'みょ', 'rya':'りゃ', 'ryi':'りぃ', 'ryu':'りゅ', 'rye':'りぇ', 'ryo':'りょ', 'gya':'ぎゃ', 'gyi':'ぎぃ', 'gyu':'ぎゅ', 'gye':'ぎぇ', 'gyo':'ぎょ', 'zya':'じゃ', 'zyi':'じぃ', 'zyu':'じゅ', 'zye':'じぇ', 'zyo':'じょ', 'ja':'じゃ', 'ju':'じゅ', 'je':'じぇ', 'jo':'じょ', 'jya':'じゃ', 'jyi':'じぃ', 'jyu':'じゅ', 'jye':'じぇ', 'jyo':'じょ', 'dya':'ぢゃ', 'dyi':'ぢぃ', 'dyu':'ぢゅ', 'dye':'ぢぇ', 'dyo':'ぢょ', 'bya':'びゃ', 'byi':'びぃ', 'byu':'びゅ', 'bye':'びぇ', 'byo':'びょ', 'pya':'ぴゃ', 'pyi':'ぴぃ', 'pyu':'ぴゅ', 'pye':'ぴぇ', 'pyo':'ぴょ', 'fa':'ふぁ', 'fi':'ふぃ', 'fe':'ふぇ', 'fo':'ふぉ', 'fya':'ふゃ', 'fyu':'ふゅ', 'fyo':'ふょ', 'xa':'ぁ', 'xi':'ぃ', 'xu':'ぅ', 'xe':'ぇ', 'xo':'ぉ', 'la':'ぁ', 'li':'ぃ', 'lu':'ぅ', 'le':'ぇ', 'lo':'ぉ', 'xya':'ゃ', 'xyu':'ゅ', 'xyo':'ょ', 'xtu':'っ', 'xtsu':'っ', 'wi':'うぃ', 'we':'うぇ', 'va':'ヴぁ', 'vi':'ヴぃ', 'vu':'ヴ', 've':'ヴぇ', 'vo':'ヴぉ' }; /* * roman -> hiragana * * @param (String) roman: * @return (String): hiragana */ function r2h(roman) { var i, iz, match, regex, hiragana = '', table = roman2hiragana; regex = new RegExp((function(table){ var key, s = '^(?:'; for (key in table) if (table.hasOwnProperty(key)) { s += key + '|'; } return s + '(?:n(?![aiueo]|y[aiueo]|$))|' + '([^aiueon])\\1)'; })(table)); for (i = 0, iz = roman.length; i < iz; ++i) { if (match = roman.slice(i).match(regex)) { if (match[0] === 'n') { hiragana += 'ん'; } else if (/^([^n])\1$/.test(match[0])) { hiragana += 'っ'; --i; } else { hiragana += table[match[0]]; } i += match[0].length - 1; } else { hiragana += roman[i]; } } return hiragana; }
コードの一部として内部で呼び出される事しか考えてないので、小文字の半角アルファベット26種類の連続した文字列しか受け付けない。記号とか漢字とか数字とか空白とか、混ざってたら駄目。
「正しく」?
当然ですが、撥音「ん」"n"が変則的なので、其の対処はしてあります。
促音「っ」もちゃんと処理します。
其れと、「先頭から全てひらがなに順次変換する信用モード」ではなくて、「ユーザが適当なキーを叩いても取り敢えず英字ひらがな混じりに変換するモード」です。
まあ普通のIMEと同じです。大した事ありませんね。
r2h(xmat) -> xまt r2h(hakkapu) -> はっかぷ r2h(nnantsun) -> んあんつn