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