1 // Copyright (c) 2013, Thomas Goyne <plorkyeran@aegisub.org>
2 //
3 // Permission to use, copy, modify, and distribute this software for any
4 // purpose with or without fee is hereby granted, provided that the above
5 // copyright notice and this permission notice appear in all copies.
6 //
7 // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8 // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9 // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10 // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11 // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12 // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13 // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14 //
15 // Aegisub Project http://www.aegisub.org/
16
17 #include "libaegisub/kana_table.h"
18
19 #include <boost/range/algorithm.hpp>
20
21 namespace {
22 agi::kana_pair kana_to_romaji[] = {
23 {"\xE3\x81\x81", "a"}, // ぁ
24 {"\xE3\x81\x82", "a"}, // あ
25 {"\xE3\x81\x83", "i"}, // ぃ
26 {"\xE3\x81\x84", "i"}, // い
27 {"\xE3\x81\x85", "u"}, // ぅ
28 {"\xE3\x81\x86", "u"}, // う
29 {"\xE3\x81\x87", "e"}, // ぇ
30 {"\xE3\x81\x88", "e"}, // え
31 {"\xE3\x81\x89", "o"}, // ぉ
32 {"\xE3\x81\x8A", "o"}, // お
33 {"\xE3\x81\x8B", "ka"}, // か
34 {"\xE3\x81\x8C", "ga"}, // が
35 {"\xE3\x81\x8D", "ki"}, // き
36 {"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
37 {"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
38 {"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
39 {"\xE3\x81\x8E", "gi"}, // ぎ
40 {"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
41 {"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
42 {"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
43 {"\xE3\x81\x8F", "ku"}, // く
44 {"\xE3\x81\x90", "gu"}, // ぐ
45 {"\xE3\x81\x91", "ke"}, // け
46 {"\xE3\x81\x92", "ge"}, // げ
47 {"\xE3\x81\x93", "ko"}, // こ
48 {"\xE3\x81\x94", "go"}, // ご
49 {"\xE3\x81\x95", "sa"}, // さ
50 {"\xE3\x81\x96", "za"}, // ざ
51 {"\xE3\x81\x97", "shi"}, // し
52 {"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
53 {"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
54 {"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
55 {"\xE3\x81\x98", "ji"}, // じ
56 {"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
57 {"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
58 {"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
59 {"\xE3\x81\x99", "su"}, // す
60 {"\xE3\x81\x9A", "zu"}, // ず
61 {"\xE3\x81\x9B", "se"}, // せ
62 {"\xE3\x81\x9C", "ze"}, // ぜ
63 {"\xE3\x81\x9D", "so"}, // そ
64 {"\xE3\x81\x9E", "zo"}, // ぞ
65 {"\xE3\x81\x9F", "ta"}, // た
66 {"\xE3\x81\xA0", "da"}, // だ
67 {"\xE3\x81\xA1", "chi"}, // ち
68 {"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
69 {"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
70 {"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
71 {"\xE3\x81\xA2", "ji"}, // ぢ
72 {"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
73 {"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
74 {"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
75 {"\xE3\x81\xA3", "c"}, // っ
76 {"\xE3\x81\xA3", "k"}, // っ
77 {"\xE3\x81\xA3", "p"}, // っ
78 {"\xE3\x81\xA3", "s"}, // っ
79 {"\xE3\x81\xA3", "t"}, // っ
80 {"\xE3\x81\xA4", "tsu"}, // つ
81 {"\xE3\x81\xA5", "zu"}, // づ
82 {"\xE3\x81\xA6", "te"}, // て
83 {"\xE3\x81\xA7", "de"}, // で
84 {"\xE3\x81\xA8", "to"}, // と
85 {"\xE3\x81\xA9", "do"}, // ど
86 {"\xE3\x81\xAA", "na"}, // な
87 {"\xE3\x81\xAB", "ni"}, // に
88 {"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
89 {"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
90 {"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
91 {"\xE3\x81\xAC", "nu"}, // ぬ
92 {"\xE3\x81\xAD", "ne"}, // ね
93 {"\xE3\x81\xAE", "no"}, // の
94 {"\xE3\x81\xAF", "ha"}, // は
95 {"\xE3\x81\xAF", "wa"}, // は
96 {"\xE3\x81\xB0", "ba"}, // ば
97 {"\xE3\x81\xB1", "pa"}, // ぱ
98 {"\xE3\x81\xB2", "hi"}, // ひ
99 {"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
100 {"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
101 {"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
102 {"\xE3\x81\xB3", "bi"}, // び
103 {"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
104 {"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
105 {"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
106 {"\xE3\x81\xB4", "pi"}, // ぴ
107 {"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
108 {"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
109 {"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
110 {"\xE3\x81\xB5", "fu"}, // ふ
111 {"\xE3\x81\xB6", "bu"}, // ぶ
112 {"\xE3\x81\xB7", "pu"}, // ぷ
113 {"\xE3\x81\xB8", "he"}, // へ
114 {"\xE3\x81\xB8", "e"}, // へ
115 {"\xE3\x81\xB9", "be"}, // べ
116 {"\xE3\x81\xBA", "pe"}, // ぺ
117 {"\xE3\x81\xBB", "ho"}, // ほ
118 {"\xE3\x81\xBC", "bo"}, // ぼ
119 {"\xE3\x81\xBD", "po"}, // ぽ
120 {"\xE3\x81\xBE", "ma"}, // ま
121 {"\xE3\x81\xBF", "mi"}, // み
122 {"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
123 {"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
124 {"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
125 {"\xE3\x82\x80", "mu"}, // む
126 {"\xE3\x82\x81", "me"}, // め
127 {"\xE3\x82\x82", "mo"}, // も
128 {"\xE3\x82\x84", "ya"}, // や
129 {"\xE3\x82\x86", "yu"}, // ゆ
130 {"\xE3\x82\x88", "yo"}, // よ
131 {"\xE3\x82\x89", "ra"}, // ら
132 {"\xE3\x82\x8A", "ri"}, // り
133 {"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
134 {"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
135 {"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
136 {"\xE3\x82\x8B", "ru"}, // る
137 {"\xE3\x82\x8C", "re"}, // れ
138 {"\xE3\x82\x8D", "ro"}, // ろ
139 {"\xE3\x82\x8F", "wa"}, // わ
140 {"\xE3\x82\x90", "wi"}, // ゐ
141 {"\xE3\x82\x91", "we"}, // ゑ
142 {"\xE3\x82\x92", "wo"}, // を
143 {"\xE3\x82\x93", "m"}, // ん
144 {"\xE3\x82\x93", "n"}, // ん
145 {"\xE3\x82\xA1", "a"}, // ァ
146 {"\xE3\x82\xA2", "a"}, // ア
147 {"\xE3\x82\xA3", "i"}, // ィ
148 {"\xE3\x82\xA4", "i"}, // イ
149 {"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
150 {"\xE3\x82\xA5", "u"}, // ゥ
151 {"\xE3\x82\xA6", "u"}, // ウ
152 {"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
153 {"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
154 {"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
155 {"\xE3\x82\xA7", "e"}, // ェ
156 {"\xE3\x82\xA8", "e"}, // エ
157 {"\xE3\x82\xA9", "o"}, // ォ
158 {"\xE3\x82\xAA", "o"}, // オ
159 {"\xE3\x82\xAB", "ka"}, // カ
160 {"\xE3\x82\xAC", "ga"}, // ガ
161 {"\xE3\x82\xAD", "ki"}, // キ
162 {"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
163 {"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
164 {"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
165 {"\xE3\x82\xAE", "gi"}, // ギ
166 {"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
167 {"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
168 {"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
169 {"\xE3\x82\xAF", "ku"}, // ク
170 {"\xE3\x82\xB0", "gu"}, // グ
171 {"\xE3\x82\xB1", "ke"}, // ケ
172 {"\xE3\x82\xB2", "ge"}, // ゲ
173 {"\xE3\x82\xB3", "ko"}, // コ
174 {"\xE3\x82\xB4", "go"}, // ゴ
175 {"\xE3\x82\xB5", "sa"}, // サ
176 {"\xE3\x82\xB6", "za"}, // ザ
177 {"\xE3\x82\xB7", "shi"}, // シ
178 {"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
179 {"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
180 {"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
181 {"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
182 {"\xE3\x82\xB8", "ji"}, // ジ
183 {"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
184 {"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
185 {"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
186 {"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
187 {"\xE3\x82\xB9", "su"}, // ス
188 {"\xE3\x82\xBA", "zu"}, // ズ
189 {"\xE3\x82\xBB", "se"}, // セ
190 {"\xE3\x82\xBC", "ze"}, // ゼ
191 {"\xE3\x82\xBD", "so"}, // ソ
192 {"\xE3\x82\xBE", "zo"}, // ゾ
193 {"\xE3\x82\xBF", "ta"}, // タ
194 {"\xE3\x83\x80", "da"}, // ダ
195 {"\xE3\x83\x81", "chi"}, // チ
196 {"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
197 {"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
198 {"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
199 {"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
200 {"\xE3\x83\x82", "ji"}, // ヂ
201 {"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
202 {"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
203 {"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
204 {"\xE3\x83\x83", "c"}, // ッ
205 {"\xE3\x83\x83", "k"}, // ッ
206 {"\xE3\x83\x83", "p"}, // ッ
207 {"\xE3\x83\x83", "s"}, // ッ
208 {"\xE3\x83\x83", "t"}, // ッ
209 {"\xE3\x83\x84", "tsu"}, // ツ
210 {"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
211 {"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
212 {"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
213 {"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
214 {"\xE3\x83\x85", "zu"}, // ヅ
215 {"\xE3\x83\x86", "te"}, // テ
216 {"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
217 {"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
218 {"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
219 {"\xE3\x83\x87", "de"}, // デ
220 {"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
221 {"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
222 {"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
223 {"\xE3\x83\x88", "to"}, // ト
224 {"\xE3\x83\x89", "do"}, // ド
225 {"\xE3\x83\x8A", "na"}, // ナ
226 {"\xE3\x83\x8B", "ni"}, // ニ
227 {"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
228 {"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
229 {"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
230 {"\xE3\x83\x8C", "nu"}, // ヌ
231 {"\xE3\x83\x8D", "ne"}, // ネ
232 {"\xE3\x83\x8E", "no"}, // ノ
233 {"\xE3\x83\x8F", "ha"}, // ハ
234 {"\xE3\x83\x90", "ba"}, // バ
235 {"\xE3\x83\x91", "pa"}, // パ
236 {"\xE3\x83\x92", "hi"}, // ヒ
237 {"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
238 {"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
239 {"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
240 {"\xE3\x83\x93", "bi"}, // ビ
241 {"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
242 {"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
243 {"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
244 {"\xE3\x83\x94", "pi"}, // ピ
245 {"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
246 {"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
247 {"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
248 {"\xE3\x83\x95", "fu"}, // フ
249 {"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
250 {"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
251 {"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
252 {"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
253 {"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
254 {"\xE3\x83\x96", "bu"}, // ブ
255 {"\xE3\x83\x97", "pu"}, // プ
256 {"\xE3\x83\x98", "he"}, // ヘ
257 {"\xE3\x83\x99", "be"}, // ベ
258 {"\xE3\x83\x9A", "pe"}, // ペ
259 {"\xE3\x83\x9B", "ho"}, // ホ
260 {"\xE3\x83\x9C", "bo"}, // ボ
261 {"\xE3\x83\x9D", "po"}, // ポ
262 {"\xE3\x83\x9E", "ma"}, // マ
263 {"\xE3\x83\x9F", "mi"}, // ミ
264 {"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
265 {"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
266 {"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
267 {"\xE3\x83\xA0", "mu"}, // ム
268 {"\xE3\x83\xA1", "me"}, // メ
269 {"\xE3\x83\xA2", "mo"}, // モ
270 {"\xE3\x83\xA4", "ya"}, // ヤ
271 {"\xE3\x83\xA6", "yu"}, // ユ
272 {"\xE3\x83\xA8", "yo"}, // ヨ
273 {"\xE3\x83\xA9", "ra"}, // ラ
274 {"\xE3\x83\xAA", "ri"}, // リ
275 {"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
276 {"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
277 {"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
278 {"\xE3\x83\xAB", "ru"}, // ル
279 {"\xE3\x83\xAC", "re"}, // レ
280 {"\xE3\x83\xAD", "ro"}, // ロ
281 {"\xE3\x83\xAF", "wa"}, // ワ
282 {"\xE3\x83\xB0", "wi"}, // ヰ
283 {"\xE3\x83\xB1", "we"}, // ヱ
284 {"\xE3\x83\xB2", "wo"}, // ヲ
285 {"\xE3\x83\xB3", "m"}, // ン
286 {"\xE3\x83\xB3", "n"}, // ン
287 {"\xE3\x83\xB4", "vu"}, // ヴ
288 {"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
289 {"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
290 {"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
291 {"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
292 {"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
293 {"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
294 {"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
295 {"\xE3\x83\xBC", "a"}, // ー
296 {"\xE3\x83\xBC", "e"}, // ー
297 {"\xE3\x83\xBC", "i"}, // ー
298 {"\xE3\x83\xBC", "o"}, // ー
299 {"\xE3\x83\xBC", "u"}, // ー
300 };
301
302 agi::kana_pair romaji_to_kana[] = {
303 {"\xE3\x81\x81", "a"}, // ぁ
304 {"\xE3\x81\x82", "a"}, // あ
305 {"\xE3\x82\xA1", "a"}, // ァ
306 {"\xE3\x82\xA2", "a"}, // ア
307 {"\xE3\x83\xBC", "a"}, // ー
308 {"\xE3\x81\xB0", "ba"}, // ば
309 {"\xE3\x83\x90", "ba"}, // バ
310 {"\xE3\x81\xB9", "be"}, // べ
311 {"\xE3\x83\x99", "be"}, // ベ
312 {"\xE3\x81\xB3", "bi"}, // び
313 {"\xE3\x83\x93", "bi"}, // ビ
314 {"\xE3\x81\xBC", "bo"}, // ぼ
315 {"\xE3\x83\x9C", "bo"}, // ボ
316 {"\xE3\x81\xB6", "bu"}, // ぶ
317 {"\xE3\x83\x96", "bu"}, // ブ
318 {"\xE3\x81\xB3\xE3\x82\x83", "bya"}, // びゃ
319 {"\xE3\x83\x93\xE3\x83\xA3", "bya"}, // ビャ
320 {"\xE3\x81\xB3\xE3\x82\x87", "byo"}, // びょ
321 {"\xE3\x83\x93\xE3\x83\xA7", "byo"}, // ビョ
322 {"\xE3\x81\xB3\xE3\x82\x85", "byu"}, // びゅ
323 {"\xE3\x83\x93\xE3\x83\xA5", "byu"}, // ビュ
324 {"\xE3\x81\xA3", "c"}, // っ
325 {"\xE3\x83\x83", "c"}, // ッ
326 {"\xE3\x81\xA1\xE3\x82\x83", "cha"}, // ちゃ
327 {"\xE3\x83\x81\xE3\x83\xA3", "cha"}, // チャ
328 {"\xE3\x83\x81\xE3\x82\xA7", "che"}, // チェ
329 {"\xE3\x81\xA1", "chi"}, // ち
330 {"\xE3\x83\x81", "chi"}, // チ
331 {"\xE3\x81\xA1\xE3\x82\x87", "cho"}, // ちょ
332 {"\xE3\x83\x81\xE3\x83\xA7", "cho"}, // チョ
333 {"\xE3\x81\xA1\xE3\x82\x85", "chu"}, // ちゅ
334 {"\xE3\x83\x81\xE3\x83\xA5", "chu"}, // チュ
335 {"\xE3\x81\xA0", "da"}, // だ
336 {"\xE3\x83\x80", "da"}, // ダ
337 {"\xE3\x81\xA7", "de"}, // で
338 {"\xE3\x83\x87", "de"}, // デ
339 {"\xE3\x83\x87\xE3\x82\xA3", "di"}, // ディ
340 {"\xE3\x81\xA9", "do"}, // ど
341 {"\xE3\x83\x89", "do"}, // ド
342 {"\xE3\x83\x87\xE3\x82\xA5", "du"}, // デゥ
343 {"\xE3\x83\x87\xE3\x82\xA5", "dyu"}, // デゥ
344 {"\xE3\x81\x87", "e"}, // ぇ
345 {"\xE3\x81\x88", "e"}, // え
346 {"\xE3\x82\xA7", "e"}, // ェ
347 {"\xE3\x82\xA8", "e"}, // エ
348 {"\xE3\x83\xBC", "e"}, // ー
349 {"\xE3\x83\x95\xE3\x82\xA1", "fa"}, // ファ
350 {"\xE3\x83\x95\xE3\x82\xA7", "fe"}, // フェ
351 {"\xE3\x83\x95\xE3\x82\xA3", "fi"}, // フィ
352 {"\xE3\x83\x95\xE3\x82\xA9", "fo"}, // フォ
353 {"\xE3\x81\xB5", "fu"}, // ふ
354 {"\xE3\x83\x95", "fu"}, // フ
355 {"\xE3\x83\x95\xE3\x83\xA5", "fyu"}, // フュ
356 {"\xE3\x81\x8C", "ga"}, // が
357 {"\xE3\x82\xAC", "ga"}, // ガ
358 {"\xE3\x81\x92", "ge"}, // げ
359 {"\xE3\x82\xB2", "ge"}, // ゲ
360 {"\xE3\x81\x8E", "gi"}, // ぎ
361 {"\xE3\x82\xAE", "gi"}, // ギ
362 {"\xE3\x81\x94", "go"}, // ご
363 {"\xE3\x82\xB4", "go"}, // ゴ
364 {"\xE3\x81\x90", "gu"}, // ぐ
365 {"\xE3\x82\xB0", "gu"}, // グ
366 {"\xE3\x81\x8E\xE3\x82\x83", "gya"}, // ぎゃ
367 {"\xE3\x82\xAE\xE3\x83\xA3", "gya"}, // ギャ
368 {"\xE3\x81\x8E\xE3\x82\x87", "gyo"}, // ぎょ
369 {"\xE3\x82\xAE\xE3\x83\xA7", "gyo"}, // ギョ
370 {"\xE3\x81\x8E\xE3\x82\x85", "gyu"}, // ぎゅ
371 {"\xE3\x82\xAE\xE3\x83\xA5", "gyu"}, // ギュ
372 {"\xE3\x81\xAF", "ha"}, // は
373 {"\xE3\x83\x8F", "ha"}, // ハ
374 {"\xE3\x81\xB8", "he"}, // へ
375 {"\xE3\x83\x98", "he"}, // ヘ
376 {"\xE3\x81\xB2", "hi"}, // ひ
377 {"\xE3\x83\x92", "hi"}, // ヒ
378 {"\xE3\x81\xBB", "ho"}, // ほ
379 {"\xE3\x83\x9B", "ho"}, // ホ
380 {"\xE3\x81\xB2\xE3\x82\x83", "hya"}, // ひゃ
381 {"\xE3\x83\x92\xE3\x83\xA3", "hya"}, // ヒャ
382 {"\xE3\x81\xB2\xE3\x82\x87", "hyo"}, // ひょ
383 {"\xE3\x83\x92\xE3\x83\xA7", "hyo"}, // ヒョ
384 {"\xE3\x81\xB2\xE3\x82\x85", "hyu"}, // ひゅ
385 {"\xE3\x83\x92\xE3\x83\xA5", "hyu"}, // ヒュ
386 {"\xE3\x81\x83", "i"}, // ぃ
387 {"\xE3\x81\x84", "i"}, // い
388 {"\xE3\x82\xA3", "i"}, // ィ
389 {"\xE3\x82\xA4", "i"}, // イ
390 {"\xE3\x83\xBC", "i"}, // ー
391 {"\xE3\x81\x98\xE3\x82\x83", "ja"}, // じゃ
392 {"\xE3\x81\xA2\xE3\x82\x83", "ja"}, // ぢゃ
393 {"\xE3\x82\xB8\xE3\x83\xA3", "ja"}, // ジャ
394 {"\xE3\x83\x82\xE3\x83\xA3", "ja"}, // ヂャ
395 {"\xE3\x82\xB8\xE3\x82\xA7", "je"}, // ジェ
396 {"\xE3\x81\x98", "ji"}, // じ
397 {"\xE3\x81\xA2", "ji"}, // ぢ
398 {"\xE3\x82\xB8", "ji"}, // ジ
399 {"\xE3\x83\x82", "ji"}, // ヂ
400 {"\xE3\x81\x98\xE3\x82\x87", "jo"}, // じょ
401 {"\xE3\x81\xA2\xE3\x82\x87", "jo"}, // ぢょ
402 {"\xE3\x82\xB8\xE3\x83\xA7", "jo"}, // ジョ
403 {"\xE3\x83\x82\xE3\x83\xA7", "jo"}, // ヂョ
404 {"\xE3\x81\x98\xE3\x82\x85", "ju"}, // じゅ
405 {"\xE3\x81\xA2\xE3\x82\x85", "ju"}, // ぢゅ
406 {"\xE3\x82\xB8\xE3\x83\xA5", "ju"}, // ジュ
407 {"\xE3\x83\x82\xE3\x83\xA5", "ju"}, // ヂュ
408 {"\xE3\x81\xA3", "k"}, // っ
409 {"\xE3\x83\x83", "k"}, // ッ
410 {"\xE3\x81\x8B", "ka"}, // か
411 {"\xE3\x82\xAB", "ka"}, // カ
412 {"\xE3\x81\x91", "ke"}, // け
413 {"\xE3\x82\xB1", "ke"}, // ケ
414 {"\xE3\x81\x8D", "ki"}, // き
415 {"\xE3\x82\xAD", "ki"}, // キ
416 {"\xE3\x81\x93", "ko"}, // こ
417 {"\xE3\x82\xB3", "ko"}, // コ
418 {"\xE3\x81\x8F", "ku"}, // く
419 {"\xE3\x82\xAF", "ku"}, // ク
420 {"\xE3\x81\x8D\xE3\x82\x83", "kya"}, // きゃ
421 {"\xE3\x82\xAD\xE3\x83\xA3", "kya"}, // キャ
422 {"\xE3\x81\x8D\xE3\x82\x87", "kyo"}, // きょ
423 {"\xE3\x82\xAD\xE3\x83\xA7", "kyo"}, // キョ
424 {"\xE3\x81\x8D\xE3\x82\x85", "kyu"}, // きゅ
425 {"\xE3\x82\xAD\xE3\x83\xA5", "kyu"}, // キュ
426 {"\xE3\x82\x93", "m"}, // ん
427 {"\xE3\x83\xB3", "m"}, // ン
428 {"\xE3\x81\xBE", "ma"}, // ま
429 {"\xE3\x83\x9E", "ma"}, // マ
430 {"\xE3\x82\x81", "me"}, // め
431 {"\xE3\x83\xA1", "me"}, // メ
432 {"\xE3\x81\xBF", "mi"}, // み
433 {"\xE3\x83\x9F", "mi"}, // ミ
434 {"\xE3\x82\x82", "mo"}, // も
435 {"\xE3\x83\xA2", "mo"}, // モ
436 {"\xE3\x82\x80", "mu"}, // む
437 {"\xE3\x83\xA0", "mu"}, // ム
438 {"\xE3\x81\xBF\xE3\x82\x83", "mya"}, // みゃ
439 {"\xE3\x83\x9F\xE3\x83\xA3", "mya"}, // ミャ
440 {"\xE3\x81\xBF\xE3\x82\x87", "myo"}, // みょ
441 {"\xE3\x83\x9F\xE3\x83\xA7", "myo"}, // ミョ
442 {"\xE3\x81\xBF\xE3\x82\x85", "myu"}, // みゅ
443 {"\xE3\x83\x9F\xE3\x83\xA5", "myu"}, // ミュ
444 {"\xE3\x82\x93", "n"}, // ん
445 {"\xE3\x83\xB3", "n"}, // ン
446 {"\xE3\x81\xAA", "na"}, // な
447 {"\xE3\x83\x8A", "na"}, // ナ
448 {"\xE3\x81\xAD", "ne"}, // ね
449 {"\xE3\x83\x8D", "ne"}, // ネ
450 {"\xE3\x81\xAB", "ni"}, // に
451 {"\xE3\x83\x8B", "ni"}, // ニ
452 {"\xE3\x81\xAE", "no"}, // の
453 {"\xE3\x83\x8E", "no"}, // ノ
454 {"\xE3\x81\xAC", "nu"}, // ぬ
455 {"\xE3\x83\x8C", "nu"}, // ヌ
456 {"\xE3\x81\xAB\xE3\x82\x83", "nya"}, // にゃ
457 {"\xE3\x83\x8B\xE3\x83\xA3", "nya"}, // ニャ
458 {"\xE3\x81\xAB\xE3\x82\x87", "nyo"}, // にょ
459 {"\xE3\x83\x8B\xE3\x83\xA7", "nyo"}, // ニョ
460 {"\xE3\x81\xAB\xE3\x82\x85", "nyu"}, // にゅ
461 {"\xE3\x83\x8B\xE3\x83\xA5", "nyu"}, // ニュ
462 {"\xE3\x81\x89", "o"}, // ぉ
463 {"\xE3\x81\x8A", "o"}, // お
464 {"\xE3\x82\xA9", "o"}, // ォ
465 {"\xE3\x82\xAA", "o"}, // オ
466 {"\xE3\x83\xBC", "o"}, // ー
467 {"\xE3\x81\xA3", "p"}, // っ
468 {"\xE3\x83\x83", "p"}, // ッ
469 {"\xE3\x81\xB1", "pa"}, // ぱ
470 {"\xE3\x83\x91", "pa"}, // パ
471 {"\xE3\x81\xBA", "pe"}, // ぺ
472 {"\xE3\x83\x9A", "pe"}, // ペ
473 {"\xE3\x81\xB4", "pi"}, // ぴ
474 {"\xE3\x83\x94", "pi"}, // ピ
475 {"\xE3\x81\xBD", "po"}, // ぽ
476 {"\xE3\x83\x9D", "po"}, // ポ
477 {"\xE3\x81\xB7", "pu"}, // ぷ
478 {"\xE3\x83\x97", "pu"}, // プ
479 {"\xE3\x81\xB4\xE3\x82\x83", "pya"}, // ぴゃ
480 {"\xE3\x83\x94\xE3\x83\xA3", "pya"}, // ピャ
481 {"\xE3\x81\xB4\xE3\x82\x87", "pyo"}, // ぴょ
482 {"\xE3\x83\x94\xE3\x83\xA7", "pyo"}, // ピョ
483 {"\xE3\x81\xB4\xE3\x82\x85", "pyu"}, // ぴゅ
484 {"\xE3\x83\x94\xE3\x83\xA5", "pyu"}, // ピュ
485 {"\xE3\x82\x89", "ra"}, // ら
486 {"\xE3\x83\xA9", "ra"}, // ラ
487 {"\xE3\x82\x8C", "re"}, // れ
488 {"\xE3\x83\xAC", "re"}, // レ
489 {"\xE3\x82\x8A", "ri"}, // り
490 {"\xE3\x83\xAA", "ri"}, // リ
491 {"\xE3\x82\x8D", "ro"}, // ろ
492 {"\xE3\x83\xAD", "ro"}, // ロ
493 {"\xE3\x82\x8B", "ru"}, // る
494 {"\xE3\x83\xAB", "ru"}, // ル
495 {"\xE3\x82\x8A\xE3\x82\x83", "rya"}, // りゃ
496 {"\xE3\x83\xAA\xE3\x83\xA3", "rya"}, // リャ
497 {"\xE3\x82\x8A\xE3\x82\x87", "ryo"}, // りょ
498 {"\xE3\x83\xAA\xE3\x83\xA7", "ryo"}, // リョ
499 {"\xE3\x82\x8A\xE3\x82\x85", "ryu"}, // りゅ
500 {"\xE3\x83\xAA\xE3\x83\xA5", "ryu"}, // リュ
501 {"\xE3\x81\xA3", "s"}, // っ
502 {"\xE3\x83\x83", "s"}, // ッ
503 {"\xE3\x81\x95", "sa"}, // さ
504 {"\xE3\x82\xB5", "sa"}, // サ
505 {"\xE3\x81\x9B", "se"}, // せ
506 {"\xE3\x82\xBB", "se"}, // セ
507 {"\xE3\x81\x97\xE3\x82\x83", "sha"}, // しゃ
508 {"\xE3\x82\xB7\xE3\x83\xA3", "sha"}, // シャ
509 {"\xE3\x82\xB7\xE3\x82\xA7", "she"}, // シェ
510 {"\xE3\x81\x97", "shi"}, // し
511 {"\xE3\x82\xB7", "shi"}, // シ
512 {"\xE3\x81\x97\xE3\x82\x87", "sho"}, // しょ
513 {"\xE3\x82\xB7\xE3\x83\xA7", "sho"}, // ショ
514 {"\xE3\x81\x97\xE3\x82\x85", "shu"}, // しゅ
515 {"\xE3\x82\xB7\xE3\x83\xA5", "shu"}, // シュ
516 {"\xE3\x81\x9D", "so"}, // そ
517 {"\xE3\x82\xBD", "so"}, // ソ
518 {"\xE3\x81\x99", "su"}, // す
519 {"\xE3\x82\xB9", "su"}, // ス
520 {"\xE3\x81\xA3", "t"}, // っ
521 {"\xE3\x83\x83", "t"}, // ッ
522 {"\xE3\x81\x9F", "ta"}, // た
523 {"\xE3\x82\xBF", "ta"}, // タ
524 {"\xE3\x81\xA6", "te"}, // て
525 {"\xE3\x83\x86", "te"}, // テ
526 {"\xE3\x83\x86\xE3\x82\xA3", "ti"}, // ティ
527 {"\xE3\x81\xA8", "to"}, // と
528 {"\xE3\x83\x88", "to"}, // ト
529 {"\xE3\x83\x84\xE3\x82\xA1", "tsa"}, // ツァ
530 {"\xE3\x83\x84\xE3\x82\xA7", "tse"}, // ツェ
531 {"\xE3\x83\x84\xE3\x82\xA3", "tsi"}, // ツィ
532 {"\xE3\x83\x84\xE3\x82\xA9", "tso"}, // ツォ
533 {"\xE3\x81\xA4", "tsu"}, // つ
534 {"\xE3\x83\x84", "tsu"}, // ツ
535 {"\xE3\x83\x86\xE3\x82\xA5", "tu"}, // テゥ
536 {"\xE3\x83\x86\xE3\x83\xA5", "tyu"}, // テュ
537 {"\xE3\x81\x85", "u"}, // ぅ
538 {"\xE3\x81\x86", "u"}, // う
539 {"\xE3\x82\xA5", "u"}, // ゥ
540 {"\xE3\x82\xA6", "u"}, // ウ
541 {"\xE3\x83\xBC", "u"}, // ー
542 {"\xE3\x83\xB4\xE3\x82\xA1", "va"}, // ヴァ
543 {"\xE3\x83\xB4\xE3\x82\xA7", "ve"}, // ヴェ
544 {"\xE3\x83\xB4\xE3\x82\xA3", "vi"}, // ヴィ
545 {"\xE3\x83\xB4\xE3\x82\xA9", "vo"}, // ヴォ
546 {"\xE3\x83\xB4", "vu"}, // ヴ
547 {"\xE3\x83\xB4\xE3\x83\xA3", "vya"}, // ヴャ
548 {"\xE3\x83\xB4\xE3\x83\xA7", "vyo"}, // ヴョ
549 {"\xE3\x83\xB4\xE3\x83\xA5", "vyu"}, // ヴュ
550 {"\xE3\x81\xAF", "wa"}, // は
551 {"\xE3\x82\x8F", "wa"}, // わ
552 {"\xE3\x83\xAF", "wa"}, // ワ
553 {"\xE3\x82\x91", "we"}, // ゑ
554 {"\xE3\x82\xA6\xE3\x82\xA7", "we"}, // ウェ
555 {"\xE3\x83\xB1", "we"}, // ヱ
556 {"\xE3\x82\x90", "wi"}, // ゐ
557 {"\xE3\x82\xA6\xE3\x82\xA3", "wi"}, // ウィ
558 {"\xE3\x83\xB0", "wi"}, // ヰ
559 {"\xE3\x82\x92", "wo"}, // を
560 {"\xE3\x82\xA6\xE3\x82\xA9", "wo"}, // ウォ
561 {"\xE3\x83\xB2", "wo"}, // ヲ
562 {"\xE3\x82\x84", "ya"}, // や
563 {"\xE3\x83\xA4", "ya"}, // ヤ
564 {"\xE3\x82\xA4\xE3\x82\xA7", "ye"}, // イェ
565 {"\xE3\x82\x88", "yo"}, // よ
566 {"\xE3\x83\xA8", "yo"}, // ヨ
567 {"\xE3\x82\x86", "yu"}, // ゆ
568 {"\xE3\x83\xA6", "yu"}, // ユ
569 {"\xE3\x81\x96", "za"}, // ざ
570 {"\xE3\x82\xB6", "za"}, // ザ
571 {"\xE3\x81\x9C", "ze"}, // ぜ
572 {"\xE3\x82\xBC", "ze"}, // ゼ
573 {"\xE3\x81\x9E", "zo"}, // ぞ
574 {"\xE3\x82\xBE", "zo"}, // ゾ
575 {"\xE3\x81\x9A", "zu"}, // ず
576 {"\xE3\x81\xA5", "zu"}, // づ
577 {"\xE3\x82\xBA", "zu"}, // ズ
578 {"\xE3\x83\x85", "zu"}, // ヅ
579 };
580
cmp_kana(agi::kana_pair const & kp,std::string const & kana)581 bool cmp_kana(agi::kana_pair const& kp, std::string const& kana) {
582 return strcmp(kp.kana, kana.c_str()) < 0;
583 }
584
585 struct cmp_romaji {
operator ()__anon2199e0730111::cmp_romaji586 bool operator()(agi::kana_pair const& kp, std::string const& romaji) const {
587 return strcmp(kp.romaji, romaji.c_str()) < 0;
588 }
operator ()__anon2199e0730111::cmp_romaji589 bool operator()(std::string const& romaji, agi::kana_pair const& kp) const {
590 return strcmp(kp.romaji, romaji.c_str()) > 0;
591 }
592
593 #ifdef _MSC_VER // debug iterator stuff needs this overload
operator ()__anon2199e0730111::cmp_romaji594 bool operator()(agi::kana_pair const& a, agi::kana_pair const& b) const {
595 return strcmp(a.romaji, b.romaji) < 0;
596 }
597 #endif
598 };
599
600 }
601
602 namespace agi {
kana_to_romaji(std::string const & kana)603 std::vector<const char *> kana_to_romaji(std::string const& kana) {
604 std::vector<const char *> ret;
605 for (auto pair = boost::lower_bound(::kana_to_romaji, kana, cmp_kana);
606 pair != std::end(::kana_to_romaji) && !strcmp(pair->kana, kana.c_str());
607 ++pair)
608 ret.push_back(pair->romaji);
609 return ret;
610 }
611
romaji_to_kana(std::string const & romaji)612 boost::iterator_range<const kana_pair *> romaji_to_kana(std::string const& romaji) {
613 for (size_t len = std::min<size_t>(3, romaji.size()); len > 0; --len) {
614 auto pair = boost::equal_range(::romaji_to_kana, romaji.substr(0, len).c_str(), cmp_romaji());
615 if (pair.first != pair.second)
616 return boost::make_iterator_range(pair.first, pair.second);
617 }
618 return boost::make_iterator_range(::romaji_to_kana, ::romaji_to_kana);
619 }
620 }
621