Archive for 6月 2009

郵便番号から住所をローマ字で得る

川崎有亮さんが公開している「AjaxZip 2.0 – Ajax郵便番号→住所自動入力フォーム(CGI不要版)」に少しだけ手を加えて、住所をローマ字で表記するものを作ってみた。このサンプルとコードおよびローマ字表記用の住所データを下記のように公開している。

準備
1. 本家の ajaxzip2.js をインストールする。
2. 配布アーカイブ内の ajaxzip2/ajaxzip2r.js をインストール先の ajaxzip2.js と同じディレクトリに置く。
3. 配布アーカイブ内の ajaxzip2/data/zip-*-r.json をインストール先の data ディレクトリに置く。
4. 住所入力する HTML ファイルで ajaxzip2.js の代わりに ajaxzip2r.js を読み込む。
基本的な使い方
郵便番号の入力欄における onkeyup イベントハンドラとして AjaxZip2.zip2addr() を登録するのは本家と同じだが、新たに 7番目の引数として真値を設定するとローマ字表記の住所を得ることができる。また、この引数を偽値にすれば、本家と同じ動作となり漢字表記の住所が得られる。その他の引数の使い方は本家と同じだが、事業所の個別郵便番号に対するローマ字表記には対応していない。
郵便番号/住所辞書の更新
ローマ字表記の辞書は漢字辞書の名前に ‘-r’ を加えた zip-*-r.json という形式になっている。この辞書を更新するにはアーカイブにある ajaxzip2/work/csv2jsonzip_r.pl を使う。使い方は本家の csv2jsonzip.pl と同じだが、事業所の個別郵便番号には対応していない。また、csv2jsonzip_r.pl を動作させるためには、次の Perl モジュールが新たに必要となる。
・Lingua::JA::Kana
・Regexp::Assemble
・Unicode::Japanese
なお、Regexp::Assemble が無くても動作するように見えるが、撥音などのローマ字表記が期待通りにならないことがある。
ローマ字表記の方法
住所をローマ字表記するため、日本郵便発行の元データに記載されている半角カタカナから Lingua::JA::Kana によってローマ字表記を得ている。元データでは都道府県名、市区町村名、町域名という3つ項目について半角カタカナが格納されているが、各項目内の表記は分かち書きされていない。そのため “サッポロシチュウオウク”(札幌市中央区)、”キタウオヌマグンカワグチマチ”(北魚沼郡川口町)のような住所データをそのままローマ字にすると、極めて読みにくいものになってしまう。そこで、市町村名と町域名に対しては何とか分かち書きをして、先の例ではそれぞれ ”Sapporo-shi Chuuou-ku”、”Kitauonuma-gun kawaguchi-machi” と表記できるようにした。ただし、かなり強引なやりかたで分かち書きをしているので、期待通りのローマ字表記にならないものがあると思う。
その他
日本郵便発行の元データによると、郵便番号と住所は一対一に対応しているわけではなく、ひとつの郵便番号に対して複数の住所レコードが存在する場合がある。このような郵便番号に対して ajaxzip2r.js は常にひとつの同じ住所しか返さない。これは本家の ajaxzip2.js も同じである。
ライセンス
MIT ライセンスとする。

Emacs における矢印や記号文字の取扱い

Emacs 22.3.1 を使って日本語の “→”(漢字の矢印文字)や “※”(こめ印)などを含む文書やプログラムコードを編集しようとすると、表示やカーソル移動の挙動がおかしくなる。これらの文字はいわゆる機種依存文字ではないはずだし、Meadow や日本語対応を明示している版だと問題なかったはずなので、素の Emacs 特有の問題だろうと推測したものの、対策することなくそのままにしていた。しかし、最近またコメント中に “→” を書いてあるコードを触ることになり、この不具合に出くわしたので調べてみたところ、次のところで回答を見つけることができた。

http://www.pqrs.org/tekezo/emacs/doc/wide-character/index.html

このサイトの情報によれば「UTF-8 において文字幅が文脈依存(ambiguous)となる文字」に対して、emacs はデフォルトで narrow character として判定するのに、表示される文字は wide character なので不具合が起こるようだ。確かにこの説明を読むとカーソル移動の挙動が納得できる。同様の現象は emacs だけでなく vi などでも発生するということだったので、vi で確認したところ確かに同じ状況となっていた。

前述のサイトに該当文字群を wide character として認識させるための emacs 用スクリプトが掲載されていたので、これを .emacs に追加することで一応は不具合を解消することができた。しかし、この設定だといわゆるローマ数字など、不具合の出る文字がまだあることに気付いた。また、機種依存文字と思っていた丸囲み数字なども unicode では定義されているので、これらの文字のコード範囲と思われるものをスクリプトに追加してみたが、なぜかうまくいくところとそうでないところがあった。結局ローマ数字の範囲だけを追加するにとどまった。通常の作業にはこれでおおよそ対応できるはずだ。

(utf-translate-cjk-set-unicode-range
  ‘((#x00a2 . #x00a3) ; ¢, £
    (#x00a7 . #x00a8) ; §, ¨
    (#x00ac . #x00ac) ; ¬
    (#x00b0 . #x00b1) ; °, ±
    (#x00b4 . #x00b4) ; ´
    (#x00b6 . #x00b6) ; ¶
    (#x00d7 . #x00d7) ; ×
    (#X00f7 . #x00f7) ; ÷
    (#x0370 . #x03ff) ; Greek and Coptic
    (#x0400 . #x04FF) ; Cyrillic
    (#x2000 . #x206F) ; General Punctuation
    (#x2100 . #x214F) ; Letterlike Symbols
    (#x2190 . #x21FF) ; Arrows
    (#x2200 . #x22FF) ; Mathematical Operators
    (#x2300 . #x23FF) ; Miscellaneous Technical
    (#x2500 . #x257F) ; Box Drawing
    (#x25A0 . #x25FF) ; Geometric Shapes
    (#x2600 . #x26FF) ; Miscellaneous Symbols
    (#x2e80 . #xd7a3)
    (#xff00 . #xffef)

    (#x2160 . #217f)))

補足(2009-07-31 追記):
Emacs のバージョン 23.1.1 からは前記の設定をしなくても、問題は発生しなくなっている。逆にこの設定のままだと 23.1.1 では起動時にワーニングが出るので、utr-translate-cjk-set-unicolde-range の設定は解除したほうが良い。→「Emacs における矢印や記号文字の取扱い ? その後」