Aegisub/aegisub/libaegisub/common/kana_table.cpp
Thomas Goyne 80c9f67ce8 Rewrite the auto-matcher for the karaoke timing copier
Operate on characters rather than bytes in the dialog so that it
actually works with Kanji.

Rewrite the auto-matcher to handle more cases and add unit tests for it.
2013-09-15 14:52:16 -07:00

622 lines
27 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Copyright (c) 2013, Thomas Goyne <plorkyeran@aegisub.org>
//
// Permission to use, copy, modify, and distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//
// Aegisub Project http://www.aegisub.org/
#include "../config.h"
#include "libaegisub/kana_table.h"
#include <boost/range/algorithm.hpp>
namespace {
agi::kana_pair kana_to_romaji[] = {
{"\xE3\x81\x81", "a"}, // ぁ
{"\xE3\x81\x82", "a"}, // あ
{"\xE3\x81\x83", "i"}, // ぃ
{"\xE3\x81\x84", "i"}, // い
{"\xE3\x81\x85", "u"}, // ぅ
{"\xE3\x81\x86", "u"}, // う
{"\xE3\x81\x87", "e"}, // ぇ
{"\xE3\x81\x88", "e"}, // え
{"\xE3\x81\x89", "o"}, // ぉ
{"\xE3\x81\x8A", "o"}, // お
{"\xE3\x81\x8B", "ka"}, // か
{"\xE3\x81\x8C", "ga"}, // が
{"\xE3\x81\x8D", "ki"}, // き
{"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
{"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
{"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
{"\xE3\x81\x8E", "gi"}, // ぎ
{"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
{"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
{"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
{"\xE3\x81\x8F", "ku"}, // く
{"\xE3\x81\x90", "gu"}, // ぐ
{"\xE3\x81\x91", "ke"}, // け
{"\xE3\x81\x92", "ge"}, // げ
{"\xE3\x81\x93", "ko"}, // こ
{"\xE3\x81\x94", "go"}, // ご
{"\xE3\x81\x95", "sa"}, // さ
{"\xE3\x81\x96", "za"}, // ざ
{"\xE3\x81\x97", "shi"}, // し
{"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
{"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
{"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
{"\xE3\x81\x98", "ji"}, // じ
{"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
{"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
{"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
{"\xE3\x81\x99", "su"}, // す
{"\xE3\x81\x9A", "zu"}, // ず
{"\xE3\x81\x9B", "se"}, // せ
{"\xE3\x81\x9C", "ze"}, // ぜ
{"\xE3\x81\x9D", "so"}, // そ
{"\xE3\x81\x9E", "zo"}, // ぞ
{"\xE3\x81\x9F", "ta"}, // た
{"\xE3\x81\xA0", "da"}, // だ
{"\xE3\x81\xA1", "chi"}, // ち
{"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
{"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
{"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
{"\xE3\x81\xA2", "ji"}, // ぢ
{"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
{"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
{"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
{"\xE3\x81\xA3", "c"}, // っ
{"\xE3\x81\xA3", "k"}, // っ
{"\xE3\x81\xA3", "p"}, // っ
{"\xE3\x81\xA3", "s"}, // っ
{"\xE3\x81\xA3", "t"}, // っ
{"\xE3\x81\xA4", "tsu"}, // つ
{"\xE3\x81\xA5", "zu"}, // づ
{"\xE3\x81\xA6", "te"}, // て
{"\xE3\x81\xA7", "de"}, // で
{"\xE3\x81\xA8", "to"}, // と
{"\xE3\x81\xA9", "do"}, // ど
{"\xE3\x81\xAA", "na"}, // な
{"\xE3\x81\xAB", "ni"}, // に
{"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
{"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
{"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
{"\xE3\x81\xAC", "nu"}, // ぬ
{"\xE3\x81\xAD", "ne"}, // ね
{"\xE3\x81\xAE", "no"}, // の
{"\xE3\x81\xAF", "ha"}, // は
{"\xE3\x81\xAF", "wa"}, // は
{"\xE3\x81\xB0", "ba"}, // ば
{"\xE3\x81\xB1", "pa"}, // ぱ
{"\xE3\x81\xB2", "hi"}, // ひ
{"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
{"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
{"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
{"\xE3\x81\xB3", "bi"}, // び
{"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
{"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
{"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
{"\xE3\x81\xB4", "pi"}, // ぴ
{"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
{"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
{"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
{"\xE3\x81\xB5", "fu"}, // ふ
{"\xE3\x81\xB6", "bu"}, // ぶ
{"\xE3\x81\xB7", "pu"}, // ぷ
{"\xE3\x81\xB8", "he"}, // へ
{"\xE3\x81\xB8", "e"}, // へ
{"\xE3\x81\xB9", "be"}, // べ
{"\xE3\x81\xBA", "pe"}, // ぺ
{"\xE3\x81\xBB", "ho"}, // ほ
{"\xE3\x81\xBC", "bo"}, // ぼ
{"\xE3\x81\xBD", "po"}, // ぽ
{"\xE3\x81\xBE", "ma"}, // ま
{"\xE3\x81\xBF", "mi"}, // み
{"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
{"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
{"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
{"\xE3\x82\x80", "mu"}, // む
{"\xE3\x82\x81", "me"}, // め
{"\xE3\x82\x82", "mo"}, // も
{"\xE3\x82\x84", "ya"}, // や
{"\xE3\x82\x86", "yu"}, // ゆ
{"\xE3\x82\x88", "yo"}, // よ
{"\xE3\x82\x89", "ra"}, // ら
{"\xE3\x82\x8A", "ri"}, // り
{"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
{"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
{"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
{"\xE3\x82\x8B", "ru"}, // る
{"\xE3\x82\x8C", "re"}, // れ
{"\xE3\x82\x8D", "ro"}, // ろ
{"\xE3\x82\x8F", "wa"}, // わ
{"\xE3\x82\x90", "wi"}, // ゐ
{"\xE3\x82\x91", "we"}, // ゑ
{"\xE3\x82\x92", "wo"}, // を
{"\xE3\x82\x93", "m"}, // ん
{"\xE3\x82\x93", "n"}, // ん
{"\xE3\x82\xA1", "a"}, // ァ
{"\xE3\x82\xA2", "a"}, // ア
{"\xE3\x82\xA3", "i"}, // ィ
{"\xE3\x82\xA4", "i"}, // イ
{"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
{"\xE3\x82\xA5", "u"}, // ゥ
{"\xE3\x82\xA6", "u"}, // ウ
{"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
{"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
{"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
{"\xE3\x82\xA7", "e"}, // ェ
{"\xE3\x82\xA8", "e"}, // エ
{"\xE3\x82\xA9", "o"}, // ォ
{"\xE3\x82\xAA", "o"}, // オ
{"\xE3\x82\xAB", "ka"}, // カ
{"\xE3\x82\xAC", "ga"}, // ガ
{"\xE3\x82\xAD", "ki"}, // キ
{"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
{"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
{"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
{"\xE3\x82\xAE", "gi"}, // ギ
{"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
{"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
{"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
{"\xE3\x82\xAF", "ku"}, // ク
{"\xE3\x82\xB0", "gu"}, // グ
{"\xE3\x82\xB1", "ke"}, // ケ
{"\xE3\x82\xB2", "ge"}, // ゲ
{"\xE3\x82\xB3", "ko"}, // コ
{"\xE3\x82\xB4", "go"}, // ゴ
{"\xE3\x82\xB5", "sa"}, // サ
{"\xE3\x82\xB6", "za"}, // ザ
{"\xE3\x82\xB7", "shi"}, // シ
{"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
{"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
{"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
{"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
{"\xE3\x82\xB8", "ji"}, // ジ
{"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
{"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
{"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
{"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
{"\xE3\x82\xB9", "su"}, // ス
{"\xE3\x82\xBA", "zu"}, // ズ
{"\xE3\x82\xBB", "se"}, // セ
{"\xE3\x82\xBC", "ze"}, // ゼ
{"\xE3\x82\xBD", "so"}, // ソ
{"\xE3\x82\xBE", "zo"}, // ゾ
{"\xE3\x82\xBF", "ta"}, // タ
{"\xE3\x83\x80", "da"}, // ダ
{"\xE3\x83\x81", "chi"}, // チ
{"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
{"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
{"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
{"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
{"\xE3\x83\x82", "ji"}, // ヂ
{"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
{"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
{"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
{"\xE3\x83\x83", "c"}, // ッ
{"\xE3\x83\x83", "k"}, // ッ
{"\xE3\x83\x83", "p"}, // ッ
{"\xE3\x83\x83", "s"}, // ッ
{"\xE3\x83\x83", "t"}, // ッ
{"\xE3\x83\x84", "tsu"}, // ツ
{"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
{"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
{"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
{"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
{"\xE3\x83\x85", "zu"}, // ヅ
{"\xE3\x83\x86", "te"}, // テ
{"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
{"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
{"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
{"\xE3\x83\x87", "de"}, // デ
{"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
{"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
{"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
{"\xE3\x83\x88", "to"}, // ト
{"\xE3\x83\x89", "do"}, // ド
{"\xE3\x83\x8A", "na"}, // ナ
{"\xE3\x83\x8B", "ni"}, // ニ
{"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
{"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
{"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
{"\xE3\x83\x8C", "nu"}, // ヌ
{"\xE3\x83\x8D", "ne"}, // ネ
{"\xE3\x83\x8E", "no"}, //
{"\xE3\x83\x8F", "ha"}, // ハ
{"\xE3\x83\x90", "ba"}, // バ
{"\xE3\x83\x91", "pa"}, // パ
{"\xE3\x83\x92", "hi"}, // ヒ
{"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
{"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
{"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
{"\xE3\x83\x93", "bi"}, // ビ
{"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
{"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
{"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
{"\xE3\x83\x94", "pi"}, // ピ
{"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
{"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
{"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
{"\xE3\x83\x95", "fu"}, // フ
{"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
{"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
{"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
{"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
{"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
{"\xE3\x83\x96", "bu"}, // ブ
{"\xE3\x83\x97", "pu"}, // プ
{"\xE3\x83\x98", "he"}, // ヘ
{"\xE3\x83\x99", "be"}, // ベ
{"\xE3\x83\x9A", "pe"}, // ペ
{"\xE3\x83\x9B", "ho"}, // ホ
{"\xE3\x83\x9C", "bo"}, // ボ
{"\xE3\x83\x9D", "po"}, // ポ
{"\xE3\x83\x9E", "ma"}, // マ
{"\xE3\x83\x9F", "mi"}, // ミ
{"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
{"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
{"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
{"\xE3\x83\xA0", "mu"}, // ム
{"\xE3\x83\xA1", "me"}, // メ
{"\xE3\x83\xA2", "mo"}, // モ
{"\xE3\x83\xA4", "ya"}, // ヤ
{"\xE3\x83\xA6", "yu"}, // ユ
{"\xE3\x83\xA8", "yo"}, // ヨ
{"\xE3\x83\xA9", "ra"}, // ラ
{"\xE3\x83\xAA", "ri"}, // リ
{"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
{"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
{"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
{"\xE3\x83\xAB", "ru"}, // ル
{"\xE3\x83\xAC", "re"}, // レ
{"\xE3\x83\xAD", "ro"}, // ロ
{"\xE3\x83\xAF", "wa"}, // ワ
{"\xE3\x83\xB0", "wi"}, // ヰ
{"\xE3\x83\xB1", "we"}, // ヱ
{"\xE3\x83\xB2", "wo"}, // ヲ
{"\xE3\x83\xB3", "m"}, // ン
{"\xE3\x83\xB3", "n"}, // ン
{"\xE3\x83\xB4", "vu"}, // ヴ
{"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
{"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
{"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
{"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
{"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
{"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
{"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
{"\xE3\x83\xBC", "a"}, // ー
{"\xE3\x83\xBC", "e"}, // ー
{"\xE3\x83\xBC", "i"}, // ー
{"\xE3\x83\xBC", "o"}, // ー
{"\xE3\x83\xBC", "u"}, // ー
};
agi::kana_pair romaji_to_kana[] = {
{"\xE3\x81\x81", "a"}, // ぁ
{"\xE3\x81\x82", "a"}, // あ
{"\xE3\x82\xA1", "a"}, // ァ
{"\xE3\x82\xA2", "a"}, // ア
{"\xE3\x83\xBC", "a"}, // ー
{"\xE3\x81\xB0", "ba"}, // ば
{"\xE3\x83\x90", "ba"}, // バ
{"\xE3\x81\xB9", "be"}, // べ
{"\xE3\x83\x99", "be"}, // ベ
{"\xE3\x81\xB3", "bi"}, // び
{"\xE3\x83\x93", "bi"}, // ビ
{"\xE3\x81\xBC", "bo"}, // ぼ
{"\xE3\x83\x9C", "bo"}, // ボ
{"\xE3\x81\xB6", "bu"}, // ぶ
{"\xE3\x83\x96", "bu"}, // ブ
{"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
{"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
{"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
{"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
{"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
{"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
{"\xE3\x81\xA3", "c"}, // っ
{"\xE3\x83\x83", "c"}, // ッ
{"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
{"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
{"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
{"\xE3\x81\xA1", "chi"}, // ち
{"\xE3\x83\x81", "chi"}, // チ
{"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
{"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
{"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
{"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
{"\xE3\x81\xA0", "da"}, // だ
{"\xE3\x83\x80", "da"}, // ダ
{"\xE3\x81\xA7", "de"}, // で
{"\xE3\x83\x87", "de"}, // デ
{"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
{"\xE3\x81\xA9", "do"}, // ど
{"\xE3\x83\x89", "do"}, // ド
{"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
{"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
{"\xE3\x81\x87", "e"}, // ぇ
{"\xE3\x81\x88", "e"}, // え
{"\xE3\x82\xA7", "e"}, // ェ
{"\xE3\x82\xA8", "e"}, // エ
{"\xE3\x83\xBC", "e"}, // ー
{"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
{"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
{"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
{"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
{"\xE3\x81\xB5", "fu"}, // ふ
{"\xE3\x83\x95", "fu"}, // フ
{"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
{"\xE3\x81\x8C", "ga"}, // が
{"\xE3\x82\xAC", "ga"}, // ガ
{"\xE3\x81\x92", "ge"}, // げ
{"\xE3\x82\xB2", "ge"}, // ゲ
{"\xE3\x81\x8E", "gi"}, // ぎ
{"\xE3\x82\xAE", "gi"}, // ギ
{"\xE3\x81\x94", "go"}, // ご
{"\xE3\x82\xB4", "go"}, // ゴ
{"\xE3\x81\x90", "gu"}, // ぐ
{"\xE3\x82\xB0", "gu"}, // グ
{"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
{"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
{"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
{"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
{"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
{"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
{"\xE3\x81\xAF", "ha"}, // は
{"\xE3\x83\x8F", "ha"}, // ハ
{"\xE3\x81\xB8", "he"}, // へ
{"\xE3\x83\x98", "he"}, // ヘ
{"\xE3\x81\xB2", "hi"}, // ひ
{"\xE3\x83\x92", "hi"}, // ヒ
{"\xE3\x81\xBB", "ho"}, // ほ
{"\xE3\x83\x9B", "ho"}, // ホ
{"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
{"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
{"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
{"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
{"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
{"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
{"\xE3\x81\x83", "i"}, // ぃ
{"\xE3\x81\x84", "i"}, // い
{"\xE3\x82\xA3", "i"}, // ィ
{"\xE3\x82\xA4", "i"}, // イ
{"\xE3\x83\xBC", "i"}, // ー
{"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
{"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
{"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
{"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
{"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
{"\xE3\x81\x98", "ji"}, // じ
{"\xE3\x81\xA2", "ji"}, // ぢ
{"\xE3\x82\xB8", "ji"}, // ジ
{"\xE3\x83\x82", "ji"}, // ヂ
{"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
{"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
{"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
{"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
{"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
{"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
{"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
{"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
{"\xE3\x81\xA3", "k"}, // っ
{"\xE3\x83\x83", "k"}, // ッ
{"\xE3\x81\x8B", "ka"}, // か
{"\xE3\x82\xAB", "ka"}, // カ
{"\xE3\x81\x91", "ke"}, // け
{"\xE3\x82\xB1", "ke"}, // ケ
{"\xE3\x81\x8D", "ki"}, // き
{"\xE3\x82\xAD", "ki"}, // キ
{"\xE3\x81\x93", "ko"}, // こ
{"\xE3\x82\xB3", "ko"}, // コ
{"\xE3\x81\x8F", "ku"}, // く
{"\xE3\x82\xAF", "ku"}, // ク
{"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
{"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
{"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
{"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
{"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
{"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
{"\xE3\x82\x93", "m"}, // ん
{"\xE3\x83\xB3", "m"}, // ン
{"\xE3\x81\xBE", "ma"}, // ま
{"\xE3\x83\x9E", "ma"}, // マ
{"\xE3\x82\x81", "me"}, // め
{"\xE3\x83\xA1", "me"}, // メ
{"\xE3\x81\xBF", "mi"}, // み
{"\xE3\x83\x9F", "mi"}, // ミ
{"\xE3\x82\x82", "mo"}, // も
{"\xE3\x83\xA2", "mo"}, // モ
{"\xE3\x82\x80", "mu"}, // む
{"\xE3\x83\xA0", "mu"}, // ム
{"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
{"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
{"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
{"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
{"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
{"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
{"\xE3\x82\x93", "n"}, // ん
{"\xE3\x83\xB3", "n"}, // ン
{"\xE3\x81\xAA", "na"}, // な
{"\xE3\x83\x8A", "na"}, // ナ
{"\xE3\x81\xAD", "ne"}, // ね
{"\xE3\x83\x8D", "ne"}, // ネ
{"\xE3\x81\xAB", "ni"}, // に
{"\xE3\x83\x8B", "ni"}, // ニ
{"\xE3\x81\xAE", "no"}, // の
{"\xE3\x83\x8E", "no"}, //
{"\xE3\x81\xAC", "nu"}, // ぬ
{"\xE3\x83\x8C", "nu"}, // ヌ
{"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
{"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
{"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
{"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
{"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
{"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
{"\xE3\x81\x89", "o"}, // ぉ
{"\xE3\x81\x8A", "o"}, // お
{"\xE3\x82\xA9", "o"}, // ォ
{"\xE3\x82\xAA", "o"}, // オ
{"\xE3\x83\xBC", "o"}, // ー
{"\xE3\x81\xA3", "p"}, // っ
{"\xE3\x83\x83", "p"}, // ッ
{"\xE3\x81\xB1", "pa"}, // ぱ
{"\xE3\x83\x91", "pa"}, // パ
{"\xE3\x81\xBA", "pe"}, // ぺ
{"\xE3\x83\x9A", "pe"}, // ペ
{"\xE3\x81\xB4", "pi"}, // ぴ
{"\xE3\x83\x94", "pi"}, // ピ
{"\xE3\x81\xBD", "po"}, // ぽ
{"\xE3\x83\x9D", "po"}, // ポ
{"\xE3\x81\xB7", "pu"}, // ぷ
{"\xE3\x83\x97", "pu"}, // プ
{"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
{"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
{"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
{"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
{"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
{"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
{"\xE3\x82\x89", "ra"}, // ら
{"\xE3\x83\xA9", "ra"}, // ラ
{"\xE3\x82\x8C", "re"}, // れ
{"\xE3\x83\xAC", "re"}, // レ
{"\xE3\x82\x8A", "ri"}, // り
{"\xE3\x83\xAA", "ri"}, // リ
{"\xE3\x82\x8D", "ro"}, // ろ
{"\xE3\x83\xAD", "ro"}, // ロ
{"\xE3\x82\x8B", "ru"}, // る
{"\xE3\x83\xAB", "ru"}, // ル
{"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
{"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
{"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
{"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
{"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
{"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
{"\xE3\x81\xA3", "s"}, // っ
{"\xE3\x83\x83", "s"}, // ッ
{"\xE3\x81\x95", "sa"}, // さ
{"\xE3\x82\xB5", "sa"}, // サ
{"\xE3\x81\x9B", "se"}, // せ
{"\xE3\x82\xBB", "se"}, // セ
{"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
{"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
{"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
{"\xE3\x81\x97", "shi"}, // し
{"\xE3\x82\xB7", "shi"}, // シ
{"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
{"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
{"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
{"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
{"\xE3\x81\x9D", "so"}, // そ
{"\xE3\x82\xBD", "so"}, // ソ
{"\xE3\x81\x99", "su"}, // す
{"\xE3\x82\xB9", "su"}, // ス
{"\xE3\x81\xA3", "t"}, // っ
{"\xE3\x83\x83", "t"}, // ッ
{"\xE3\x81\x9F", "ta"}, // た
{"\xE3\x82\xBF", "ta"}, // タ
{"\xE3\x81\xA6", "te"}, // て
{"\xE3\x83\x86", "te"}, // テ
{"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
{"\xE3\x81\xA8", "to"}, // と
{"\xE3\x83\x88", "to"}, // ト
{"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
{"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
{"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
{"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
{"\xE3\x81\xA4", "tsu"}, // つ
{"\xE3\x83\x84", "tsu"}, // ツ
{"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
{"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
{"\xE3\x81\x85", "u"}, // ぅ
{"\xE3\x81\x86", "u"}, // う
{"\xE3\x82\xA5", "u"}, // ゥ
{"\xE3\x82\xA6", "u"}, // ウ
{"\xE3\x83\xBC", "u"}, // ー
{"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
{"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
{"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
{"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
{"\xE3\x83\xB4", "vu"}, // ヴ
{"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
{"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
{"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
{"\xE3\x81\xAF", "wa"}, // は
{"\xE3\x82\x8F", "wa"}, // わ
{"\xE3\x83\xAF", "wa"}, // ワ
{"\xE3\x82\x91", "we"}, // ゑ
{"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
{"\xE3\x83\xB1", "we"}, // ヱ
{"\xE3\x82\x90", "wi"}, // ゐ
{"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
{"\xE3\x83\xB0", "wi"}, // ヰ
{"\xE3\x82\x92", "wo"}, // を
{"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
{"\xE3\x83\xB2", "wo"}, // ヲ
{"\xE3\x82\x84", "ya"}, // や
{"\xE3\x83\xA4", "ya"}, // ヤ
{"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
{"\xE3\x82\x88", "yo"}, // よ
{"\xE3\x83\xA8", "yo"}, // ヨ
{"\xE3\x82\x86", "yu"}, // ゆ
{"\xE3\x83\xA6", "yu"}, // ユ
{"\xE3\x81\x96", "za"}, // ざ
{"\xE3\x82\xB6", "za"}, // ザ
{"\xE3\x81\x9C", "ze"}, // ぜ
{"\xE3\x82\xBC", "ze"}, // ゼ
{"\xE3\x81\x9E", "zo"}, // ぞ
{"\xE3\x82\xBE", "zo"}, // ゾ
{"\xE3\x81\x9A", "zu"}, // ず
{"\xE3\x81\xA5", "zu"}, // づ
{"\xE3\x82\xBA", "zu"}, // ズ
{"\xE3\x83\x85", "zu"}, // ヅ
};
bool cmp_kana(agi::kana_pair const& kp, std::string const& kana) {
return strcmp(kp.kana, kana.c_str()) < 0;
}
struct cmp_romaji {
bool operator()(agi::kana_pair const& kp, std::string const& romaji) const {
return strcmp(kp.romaji, romaji.c_str()) < 0;
}
bool operator()(std::string const& romaji, agi::kana_pair const& kp) const {
return strcmp(kp.romaji, romaji.c_str()) > 0;
}
#ifdef _MSC_VER // debug iterator stuff needs this overload
bool operator()(agi::kana_pair const& a, agi::kana_pair const& b) const {
return strcmp(a.romaji, b.romaji) < 0;
}
#endif
};
}
namespace agi {
std::vector<const char *> kana_to_romaji(std::string const& kana) {
std::vector<const char *> ret;
for (auto pair = boost::lower_bound(::kana_to_romaji, kana, cmp_kana);
pair != std::end(::kana_to_romaji) && !strcmp(pair->kana, kana.c_str());
++pair)
ret.push_back(pair->romaji);
return ret;
}
boost::iterator_range<const kana_pair *> romaji_to_kana(std::string const& romaji) {
for (size_t len = std::min<size_t>(3, romaji.size()); len > 0; --len) {
auto pair = boost::equal_range(::romaji_to_kana, romaji.substr(0, len).c_str(), cmp_romaji());
if (pair.first != pair.second)
return boost::make_iterator_range(pair.first, pair.second);
}
return boost::make_iterator_range(::romaji_to_kana, ::romaji_to_kana);
}
}