Diary?

2008-03-02
Sun

(21:22)

ここ数日は世界樹のページへの検索エンジンからのアクセスが多いのだけど、何ていうかあんま攻略になってないんだよな、あのページ。それはともかく、通算7話目追加。ゲームをプレイしながら話を考えているので、どういう方向に転がしていいかさっぱりわからん。っていうか単にキャラクターがダベっているだけといえばそうだ。

(23:45)

俺はアクセスログの解析はすべて自前のスクリプトでやっているのだが、ムカつくことが一つ。いや、本当は一つどころの騒ぎじゃないけど、とりあえず一つ挙げる。

多くの検索エンジンでは、検索のクエリを URL に含める (= GET メソッド) 方式を取っている。そのおかげでどういう検索語でたどり着いたのかということがわかるわけだが、実はこれが結構厄介だ。その厄介さについて簡単な例を示すとこうだ。

まずは Python インタープリタを立ち上げて、そのあとインタープリタ上で次のように入力してみよう。

>>> import urllib
>>> urllib.quote(u'あ'.encode('utf-8'))
>>> urllib.quote(u'あ'.encode('sjis'))
>>> urllib.quote(u'あ'.encode('euc-jp'))

三つとも違った結果になるはずだ。これは要するに URL に使える文字にマルチバイト文字を変換する場合、それぞれの文字を 1 バイトずつ変換してるから当然のことだ。そして大抵の場合は検索エンジンのクエリにはこれと同じようにクォートされた文字列が使われているので、同じ検索語でも文字コードによってクエリに使われる文字列は変わるわけだ (大抵は検索画面のエンコーディングに一致する)。そして不愉快なことに検索クエリに GET 要求時の文字コードを含まない検索エンジンもあり、検索語を見ようとしたら UnicodeDecodeError を補足してどうこうするという実にふざけたコードを書くのが一番手っ取り早いということになる。

話はまだ終わらない。これだけで済むのならまだいいが、極めて fuck なことに変換をかける際に例えば Shift-JIS におけるローマ数字のような JIS X 0208 で未定義の文字については、当然 sjis などとコーデック名に書いた場合にはこけてしまう。これは正しい動作だ。こういった場合にはコーデック名に shift-jis-2004 や shift-jisx0213 あたりを指定すればいい。ローマ数字は JIS X 0213 で取り入れられ、それに対応したコーデックなら無問題だ。結構な量の文字が JIS X 0213 では取り入れられ、 Windows Vista では JIS X 0213 対応という話も聞いたことがあるので、単に sjis をコーデックには指定しない方が良さそうではある。もっとも、 Vista でのデフォルトの MBCS が何なのかは知らない。

ここで「じゃあ Python で Shift-JIS を扱うときには shift-jis-2004 あたりをコーデックに使えばいいんだな」と思ってはいけない。これは Python に限った話ではなく、なおかつ酷い問題なのだが、 JIS X 0208 ではローマ数字や記号の一部はユーザ定義の外字扱いで、この外字部分は NEC 特殊文字と NEC 選定 IBM 拡張文字と IBM 拡張文字で全然違うコードが使われており、そして NEC 選定 IBM 拡張文字と IBM 拡張文字は cp932 でないと期待した通りに処理できない。いわゆる文字化けだ。そして Windows では cp932 が Shift-JIS のように扱われていたはずで、俺はこういうところに怒りを感じるわけだ。

この文字集合とか符号化方式あたりの話は頭がこんがらがるのでなるべく考えたくねえのが本音で、俺はもうバカの一つ覚えで UTF-8 でやり取りしやがれとしか思っておらず、そして俺はこの場合のバカの一つ覚えは多くの場合で正しいと思っている。

Creative Commons
この怪文書はクリエイティブ・コモンズ・ライセンスの元でライセンスされています。引用した文章など Kuwata Chikara に著作権のないものについては、それらの著作権保持者に帰属します。