旅行アプリ「Daylight Trip」の都市検索で、「京都」が出てこないことに気づきました。「Kyoto」なら出る。「キョウト」でも出る。でも、漢字の「京都」では出ない。

日本人が地名を入力するとき、最初に打つのはまず漢字です。つまり実質「京都が収録されていない」のと同じでした。今日はこの修正(v1.2.1)を両ストアの審査に出したので、原因を書き残しておきます。
原因: 「かなを含む名前を選ぶ」ルールの裏目
Daylight Trip は完全オフラインで動くために、GeoNames由来の約3.4万都市を内蔵しています。各都市にはたくさんの別名(各国語の表記)がぶら下がっていて、その中から日本語名を選ぶとき、私はこういうルールにしていました。
「かな(ひらがな・カタカナ)を含む、いちばん短い別名を採用する」
パリ→「パリ」、オスロ→「オスロ」。海外の都市では完璧に働きます。日本語の表記はカタカナですから。
ところが日本の都市では、このルールが読み仮名を拾ってしまう。京都の別名リストには「京都」「京都市」「キョウト」が並んでいて、「かなを含む」条件に合うのはキョウトだけ。結果、京都の日本語名は「キョウト」になり、漢字検索に一致しなくなっていました。大阪は「おおさかし」、奈良にいたっては日本語名なし。調べてみると、日本の都市192件が同じ状態でした。
海外都市のために作ったルールが、母国の都市でだけ壊れる。灯台下暗しとはこのことです。
第2の罠: 東京が「东京」になる
修正は「漢字を含むいちばん短い別名を選ぶ」に変えるだけ——と思ったら、もうひとつ罠がありました。
検証すると、東京が 「东京」 になっている。「东」は中国語の簡体字です。GeoNamesの別名リストには中国語表記も混ざっていて、「東京」と「东京」はどちらも2文字。文字コード順で簡体字が先に選ばれてしまったのです。
日本語では使わない簡体字(东・广・岛・泽など)の除外リストを作って解決しました。広島が「广岛」になる未来を、ぎりぎりで回避です。
教訓
- 多言語データの「日本語名」選びは、カタカナ圏(海外)と漢字圏(国内)でルールが逆になる。ひとつのルールで両方を賄おうとすると片方が壊れる
- 修正のテストには「東京が簡体字でないこと」まで入れました。データの罠は、直した形でテストに固定しておかないと再発します
- そして、市クラスの地名はデータで、観光地や小さな駅は自由入力+履歴で。検索の守備範囲を「全部データで」ではなく二段構えにしたことが、今回の修正を小さく保ってくれました
v1.2.1 は現在審査中です。「京都に行こう」と思ったときに「京都」と打てば出てくる——当たり前のことが、ようやく当たり前になります。
アプリの詳細はこちら: Daylight Trip 紹介ページ
Daylight Trip は SINQWELL のアプリです(Android / iOS で公開中)。


