WebOS Goodies

WebOS の未来を模索する、ゲームプログラマあがりの Web 開発者のブログ。

WebOS Goodies へようこそ! WebOS はインターネットの未来形。あらゆる Web サイトが繋がり、共有し、協力して創り上げる、ひとつの巨大な情報システムです。そこでは、あらゆる情報がネットワーク上に蓄積され、我々はいつでも、どこからでも、多彩なデバイスを使ってそれらにアクセスできます。 WebOS Goodies は、さまざまな情報提供やツール開発を通して、そんな世界の実現に少しでも貢献するべく活動していきます。
Subscribe       

UTF-8 エンコーディングの危険性の補足

えー、昨日投稿した「UTF-8 エンコーディングの危険性」の記事ですが、なにを間違ったのか過去最高のアクセスを記録しています。その前の Ruby 用 JSON クラスの反響がさほどでもなく、今回も大したことないだろうと思っていたので、かなりびびってます(((゜Д゜;)))ガクガク。はてぶコメントでも多くのご指摘をいただきまして、私自身反省している点もあるので、少し補足しておこうかと思います。

昨日の記事の意図は、まず単純に不正な UTF-8 シーケンスの存在を知ってもらい、そして具体的な対策として、入力の水際で不正な UTF-8 シーケンスを潰してしまおうというものです。ここが説明の足りなかった部分ですが、入力段で HTML などのエスケープをしようということではありません。 UTF-8 の正規化は HTML などのそれと違って二重にかけても結果が変わりません。また、目的はクライアントの保護ではなく、サーバー内での誤動作を防ぐことです。ですから、できるだけ初期の段階で処理するのが最善と考えています(ただし、内部処理で文字コード展開がある場合は注意です)。例として挙げた処理がへたれだったこと(笑)、不正なシーケンスの例に '<' を使ったことがまずかったようで、だいぶ誤解を誘ってしまったように思います。これは私の失敗で、反省しています。

趣味の範疇ですが、私自身も実際にまずいコードを作りかけたことがあります。この blog の過去ログを Ruby スクリプトで処理しようとしたところ、 REXML が不正な文字コードの例外を飛ばしてきたのです。当時は詳細を知らなかったので、「試しに直前で UTF-8→UCS→UTF-8 変換をかましてから喰わしてみようか、最悪でも文字化けするくらいだろう」と思って実装しかけました。まさに不正なシーケンスが ASCII に化けてしまう変換です。まあ、実際やったとしても自分の作った記事ですから実害はなかったでしょうが、もし公開アプリケーションの外部入力だったらと思うとぞっとします。

もうひとつ、私が不正な UTF-8 シーケンスの存在を意識した理由が、実は Gmail なんです。 HTML メールを受信すると、けっこう頻繁にそれっぽい文字化けが出るんですよ。

元のメールは ISO-2022+quoted-printable なので、そこから UTF-8 への変換にバグがあるようです。とくに問題になるものではないようですが、微妙に不安ですね(´Д`;。今回の件とは異なる問題かもしれませんが、 Google ですら不正なシーケンスを送ってくることがある、というのは頭の片隅で意識しておくべきでしょう。これが JSON パーサーに検証機能を付けた動機です。 JSON フィードにもなにが入っているかわかりませんからね(笑)。

ところで、はてぶコメントのご指摘でひとつだけよくわからないものがあるんです。「UTF-8 を内部コードとして使うことはない」というもので、個人的には疑問符いっぱいです。 UTF-8 はマルチバイトの区切りが明確で多言語対応も容易なので、内部コードとしても使いやすいと思うのですが・・・。意図されているのが Java や C# といったワイド文字ベースの言語で、 Ruby などのナロー文字な言語は対象外という解釈なら納得ですが、そういうことなのかなぁ(^^;。もし私の知らない「UTF-8 を内部コードとしては使わない理由」があるのなら、今後のためにも知っておきたいです。そのような理由をご存知の方がおられましたら、ぜひ教えてくださいませ。

最後になってしまいましたが、お礼&お知らせです。先日の記事で UTF-8 を検証する簡単な方法としてご紹介した String#unpack と iconv ですが、 kazutanaka さんがわざわざ速度比較してくださったようで、結果として String#unpack のほうが速かったそうです。ただ、 iconv は Ruby 以外でも使える汎用的なライブラリなので、依然として覚えておく価値がある思います。情報をくださった kazutanaka さんに感謝です。

以上、本日は昨日の記事に対する補足をさせていただきました。関係ないですが、はてぶなどのコメントはとても参考になりますね。読み手がどういう風に解釈したかがわかるのは貴重です。これまではあまりきちんと読んでいなかったのですが、今後はなるべく読むようにしようと思っています。それでは、このへんで。

2007/2/23 追記

UTF-8 の不正なシーケンスを正常な文字に置き換える処理は「正規化」と呼ぶのが正しいようですので、該当部分を修正しました。ご指摘くださった皆さん、ありがとうございます。基本的に門外漢なので、専門の方からすると稚拙な部分が多々あるかと思います。お気づきの点はどうかご指摘ください。さすがにいつまでもはてぶコメントをチェックし続けるのは無理なので、コメントなどでお願いします m(_ _)m

関連記事

この記事にコメントする

Recommendations
Books
「Closure Library」の入門書です。
詳しくはこちらの記事をどうぞ!
Categories
Recent Articles