URI encodeの憂鬱


職場で情報集積のために使っていたPukiwikiの外部リンクが一部エラーに
なっているのに気が付いた。ちなみにそのリンクには、思いっきり日本語が
含まれている


どうも、XP SP2に関連する別の不具合の対策として「常にUTF-8としてURLを送信す
る」のチェックを外した結果、Pukiwikiが生成するURIに含まれる文字コード(おそら
EUC_JP)とサーバー側のリソースに含まれる文字コード(Shift_JIS)がアンマッチに
なったためだと思われる。UTF-8だと問題が表面化しなかった理由が謎だが、Webサー
バーがWin32版apacheなので、まぁそういうこともあるかな、とも思う。


そもそもエスケープしてない日本語を含むURIを公開するな、と言いたいところでは
あるが、ウチの会社は情報システム部門の慢性的な人不足(能力的な問題だけでなく
純粋な頭数すら足りない)から、ウチの職場を含め社内の各部門が好き勝手にサー
バー構築をしているのが実情。とにかく動くことが最優先で、「標準」に対して注意
を払ってこなかったのだ。結果として、クラアントやサーバーの環境が変化するとこ
のように様々な問題が起こる可能性を、あちこちのシステムが抱え込んでいる。


どちらかというと「原理主義者」なんだけど、権限も無いのに相手に「直せ!」とま
で主張するつもりはない(角が立つし)。仕方がないので、rubyのone linerで


ruby -ruri -e 'p URI.encode("ほげ")
てな感じで、Pukiwiki内のリンクをちまちま手動修正。だけど、一部どうにも飛ばな
いリンクがある。しばらく頭を冷やしてからよくよくリンクの文字を見ると…
が入ってるじゃないか、が!あぁ、世に言
う「表ソ十問題」(=2バイト目に'\'(0x5c) を含むSJIS文字が、文字列操作時に
様々な問題を引き起こす)に引っかかってしまったようで。


# ちなみに上記のone linerはWindowsコマンドプロンプト(≠cygwin)で実行。


ということで、上のone linerを


ruby -Ks -ruri -e 'p URI.encode("ほげ")
に訂正。こうやってスクリプト内の文字はShift_JISだときちんとrubyに教えてあげ
れば、後はよろしく取り計らってくれる。


ちなみにURI encodeに関連するRFC 2396(日本語訳)
は、RFC 3986(日本語訳)の公開によっ
てobsoluteになっている。その結果、上記のような処理は"escape"ではなく
"percent-encode"と呼ばれるようになったようだ。ruby 1.8.4では、
URI.encode/decodeはURI.escape/unescapeのaliasとして定義されているんだけど、
こういうのってきちんと直した方が良いんだろうか?