トラックバック仕様のジレンマ(HTTP の文字エンコーディング)

先の記事(メタ情報の扱いに関する話)を前提として。

さて、ここで唐突にトラックバックなんぞを見てみます。トラックバックは MovableType が独自に実装した「実装先行」の仕様であり、当然当初は日本語に対する考慮なんてありませんでした。でも、今はそこそこ正しく日本語を含むトラックバックが送受信できています。でも、一部のサイトにはトラックバックを送ると文字化けが起こるということが未だに発生しています。これはなぜでしょうか?

まぁ、海外からやってきた技術は全般的にそうなので仕方がないという話でもありますが、センスの悪い解決方法しか取れていないからです。とはいえ、こうなってしまう根本的な問題はトラックバック以前に HTTP、というより HTML(FORM) の仕様にあるのですが。

現在は、POST するデータ内部に charset=EUC-JP;title=.... のように記述する方式が言われています。これは前回書いたとおり、センスの悪い方式です。トラックバック程度であれば charset パラメタを探してから全体を再デコードするのも対して苦ではないため、まだよいですが。

本来はリクエストヘッダにて charset が指定されるべきですし、それで容易に解決できるはずの問題でした。しかし HTTP リクエストに関してはいつまでたってもその方式を取らずに、application/x-www-form-urlencoded という文字エンコードに関する規定のない(なかった)方式を世界中で使っているのです。それによって、リクエストボディを読み込むために必須のメタ情報であるはずの文字エンコーディングが、いったいどこを見たらいいのか解らないという混乱がずっと続いています。
トラックバックの文字コードに関する約束はセンスが悪いですが、通常の POST ではまったく規定のない最悪の状態であることを考えるとまだマシというわけです。つまり、問題は HTML(FORM) の仕様にあるわけです。

他の例も少しだけ挙げます。必須のメタ情報がコンテンツに埋め込まれている例としては、メジャーな物として画像フォーマットなどにおける MAGIC があります。たとえば GIF 形式のファイルをバイナリエディッタなどで開くと先頭が "GIF87a" 等となっていたりします。これはそのファイルが GIF であることを識別できるようにするためのものですが、前記事の前提に則ると、やはり本来ここにあるべき物ではない、と言えます。しかし、コンテンツ以外の部分から常にこのメタ情報が入手できるか、というと、そうもいかないケースも多いことから、現在はほとんどのマルチメディア系コンテンツが採用している方式です。前記事で言うところの「情報をひとくくりにするというメリットとのトレードオフ」なのです。

この例を由とするなら、前記事の meta タグの件や今回のトラックバックについても許せる話じゃないか、と言われそうですが、やはりそれぞれ以下の問題からこの二つは画像フォーマットのようなケースと同一視できないセンスの悪さを感じます。

  • meta タグの設置位置について、ブラウザが流動的過ぎる解釈を採用してしまったこと。
  • HTTP が前提でありながら、HTTP ヘッダが活用されていない(活用できないのだが)こと。

リクエストボディ(QUERY_STRING はまた別として)のエンコーディングは、慣習に沿った普通の感性ならリクエストの Content-Type にて明示されるべきものに思えます。しかし、POST でデフォルトで用いられる application/x-www-form-urlencoded というメディアタイプでは事実上 charset パラメタを付けてはいけないとされてしまっています。現在は HTTP-POST でリクエストの文字エンコーディングを明示したい場合は multipart/form-data を用いろ、と言われていますが、それを守っているブラウザは現状は皆無でしょう。

これ、実はメジャーなブラウザがポンっとサポートしてしまえば一気に解決できるのではないかと思えるのですが、何年たっても一向に状況に変化がないようですね。application/x-www-form-urlencoded ではなく、text/x-www-form-urlencoded にして charset を指定する、とか、ブラウザ側がやったとしても大抵のサーバにはいきなり影響が出ることはないわけだし…あんまり考えてはいないですが。
というか、IANA には未だに登録されていない(multipart/form-data はあるのに)し、HTML 仕様の方でしか規定されていないのってなんなのよ。
参考:application/x-www-form-urlencoded
現実には携帯電話などは application/x-www-form-urlencoded; charset=Shift_JIS といったこともやるようです。私はそれでよいと思いますけどね。XForms では UTF-8 を使うことと書かれていますが過去との互換性を考えるとまだまだ移行は厳しいでしょう。

このあたりに関連する話は、[XML-users-8594] から続くスレッドでも以前詳しく議論されていました。

このようなメタ情報に関する約束は、最初に拡張性のある方式が取られていることと、最初にサポートする人にセンスがあることが如何に肝心であるかを感じさせます。

(追記)
書いた直後に発見。
Trackback I18N: blog.bulknews.net
お、現在は(Content-Type の) charset パラメタを付けるようになってるんですかねぇ…?それなら大歓迎ですが。日本での実装的には UTF-8 / EUC-JP しかなさそうで、今後は UTF-8 決め打ちに進むんでしょうけど EUC しか受け付けてないサーバは…サポートしてもらうしかないでしょうな。

トラックバック(0)

このブログ記事を参照しているブログ一覧: トラックバック仕様のジレンマ(HTTP の文字エンコーディング)

このブログ記事に対するトラックバックURL: http://www.sk-jp.com/mt/mt-tb.cgi/306

コメントする

このブログ記事について

このページは、Shinが2004年11月 8日 23:47に書いたブログ記事です。

ひとつ前のブログ記事は「メタ情報の扱いに関する話その1(必須情報編)」です。

次のブログ記事は「JavaMail 完全解説の原稿を公開しました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。