最近Legacy Encoding Projectのメーリングリスト(参加はコチラからどうぞ)でEUCの相互運用性(interoperability)を改善しようって話が盛り上がってる。

で、最近ヒトサマのBlogを見ているとBlog界もやっぱりまだまだ文字化けにあふれているようだ。

例えば、浅倉様のはてなもそろそろEncode::EUCJPMSを使ってくれないかなあ
および404 Blog Not Found様のあなたは何の役に立つのか?というエントリのhyoshikさんの ①(まるいち)という文字というエントリからのトラックバックをみるとはてなの吐き出すRSSやPingは「~」「①」は化けるらしい


と、いうわけで、いささか興味がわいたのでちょっと色々調べてみた。
文字化けの原因として、
・ブラウザ側の問題
・サーバー側の問題
・その複合原因
とあるが、今回はブラウザの挙動のみを対象にした。


調査対象のブラウザは以下を選んだ

IE: 6.0.2900.2180.xpsp_sp2_gdr.050301-1519
Firefox: 1.5.0.3
Opera: 8.53(Build 7722)


ちなみに当サイトに訪れるユーザのブラウザの割合は以下のような感じで、

順位 ブラウザ名            パーセント
--------------------------------------
1 Internet Explorer 6 66.19%
2 Firefox 24.44%
3 Safari 2.12%
4 Opera 8 1.28%
5 Internet Explorer 7 1.07%
6 Internet Explorer 5.5 0.94%
7 Opera 8 0.55%
8 Netscape 7 0.48%
9 Internet Explorer 5.0 0.47%
10 Opera 9 0.16%
11 Camino 0.10%
12 Opera 7 0.10%
13 NetFront 0.09%
14 Opera 9 0.05%
15 Netscape 6 0.02%
16 Opera 7 0.02%
17 DoCoMo 0.02%
18 Internet Explorer 4 0.01%
19 Netscape 8 0.01%
20 その他 1.80%


バージョン違い、亜種をまとめると

IE系          68.68% 
Mozilla系 25.05%
Opera系 2.16%
Safari 2.12%
その他 1.91%


という感じでIEとFirefoxだけがちゃんと調べないといけなくて、あとは誤差って感じだ。
調べ方は単純、自分のはてなダイアリーの日記欄に色々なブラウザで同じコメント書いてみて、 etherealでパケットキャプチャー。
どのような文字コードを送出しているか調べるというものだ。(ちなみに、はてなダイアリーの文字コードはEUC-JPである)

脱線だが有名Blogの文字コードをいくつか調べたところ

ブログサーバ    文字コード
---------------------------
はてな EUC-JP
FC2 EUC-JP
livedoor EUC-JP
ココログ UTF-8



という結果になったので、EUCとUTF-8さえ押さえれば、Blog界の文字化け問題の対応としてはだいたいOKと言えそうである。


まず、ASCII文字(アルファベット)

書き込み文字列      abc
------------------------------
IE abc
Firefox abc
Opera abc



すべて同じ結果。
ASCIIしか使わない限りにおいて文字化けは発生しないという、非常に当たり前の結果になった。


次、JIS X 208 のひらがな

書き込み文字列    あいう
--------------------------------------
IE %A4%A2%A4%A4%A4%A6
Firefox %A4%A2%A4%A4%A4%A6
Opera %A4%A2%A4%A4%A4%A6


すべて同じ結果。
さすがに、この程度では文字化けしない。まあ当たり前である。

ここで、規格の復習。
HTMLの規格上、ブラウザは文字列をPOSTするのに、
のmethod属性を設定しないと文字列を URLEncodingというエンコーディングを行ってからPOSTします。
ところが、規格ではASCII の範囲外のエンコーディング方法をちゃんと定めていません。
定めていませんが、大昔、Netscape2.0ぐらいのときにネスケが文字列を「見ている文書がEUCならEUCのバイト列を」
「見ている文書がSJISならSJISのバイト列を」エンコーディングするぜぃ。という実装をしたので、それがデファクトです。
これは歴史があるので、もう守ってない人を見たことがないぐらい強いデファクト。

EUC-JPでは「あ」「い」「う」はそれぞれ

文字    バイト列
------------------
あ A4 A2
い A4 A4
う A4 A6


というバイト列で表される。それを%でエスケープしているだけ。


次は、XML日本語プロファイルで文字化けする文字として、注意を喚起されている記号シリーズ

ASCII で注意喚起されている文字

書き込み文字列     \~
-------------------------
IE %5C%7E
Firefox %5C%7E
Opera %5C%7E


特に問題なし。


次、JIS X 208の記号で注意喚起されている文字

書き込み文字列      ̄―~∥-¢£¥¬~ 
----------------------------------------------------------------------------------
IE %A1%B1%A1%BD%A1%C1%A1%C2%A1%DD%A1%F1%A1%F2%A1%EF%A2%CC%A1%C1%FC%FC
Firefox %A1%B1%A1%BD%A1%C1%A1%C2%A1%DD%A1%F1%A1%F2%A1%EF%A2%CC%A1%C1%FC%FC
Opera %A1%B1%A1%BD%A1%C1%A1%C2%A1%DD%A1%F1%A1%F2%A1%EF%A2%CC%A1%C1%FC%FC


こちらも問題なし。



次からはWindowsの機種依存文字シリーズで攻めてみましょう

まずNEC特殊文字、①とか

書き込み文字列         ①
-----------------------------------------------
IE %AD%A1
Firefox %AD%A1
Opera %AD%A1


すべて同じ。
本当はEUCに無い文字なので、数値文字参照にしないとうまく表示できない可能性がある文字なのだが
全ブラウザ生EUCで送っている。
なお、この独自拡張EUCをMicrosoftはCP51932と呼んでいるので、詳しい仕様はググって頂きたい。

※ ここはすべて同じだから幸せとはまったくいえない状況なので別に詳しく説明する。


次、IBM拡張文字とNEC選定IBM拡張文字

書き込み文字列         髙(はしご高)
-----------------------------------------------
IE %FC%E2
Firefox %FC%E2
Opera %FC%E2


こちらも全ブラウザ生EUCとして(生CP51932として、というべき?)送出している。

この文字はIMEパッドを使わないと入力できないが、NEC選定IBM拡張文字の(SJISで0x7C62)でも
IBM拡張文字の髙(SJISで0xFBFC)でも、NEC選定IBM拡張文字の(SJISで0x7C62, EUCで0xFCE2)に変換されてしまった。
まあ、IBM拡張文字はEUCでエンコード不可能なのでNEC選定に変換するか数値文字参照に変換するかの実質二択なのだけれども。

さあ、これにてWindows機種依存文字オシマイ。



次、JIS X 201カタカナ(半角カタカナ)

書き込み文字列   アイウエオ
----------------------------------------------
IE %8E%B1%8E%B2%8E%B3%8E%B4%8E%B5
Firefox %8E%B1%8E%B2%8E%B3%8E%B4%8E%B5
Opera %8E%B1%8E%B2%8E%B3%8E%B4%8E%B5


すべて同じ.

ここで、ちょっと面白い現象がおこった。
ブラウザはたしかに半角カタカナでアイウエオとPOSTしているのに、掲示板には全角でアイウエオと書かれるのだ。
どうもはてながサーバー側で変換しているっぽい。

これはあまり嬉しくない仕様ですね。
はてなさん、全角カタカナではなく数字文字参照への変換をオススメします。



次、JIS X 212 漢字(補助漢字)

これは説明が必要だろう。
私の使っているWindows XP ではデフォルトの状態では補助漢字は入力できない。
しかしながら、MS IMEのプロパティで「辞書/学習」タブを開き、単漢字辞書のチェックボックスをONにすることで入力が可能になる。

これ、僕みたいに古いユーザーは習慣でONにしているから、知り合いに鷗外(森鴎外の難しいほうの漢字)が入力できない。とか相談されると
「あれ~、うちでは出来るで~」などと素っ頓狂な対応をしてしまうクセモノである。

書き込み文字列    鷗(鴎外の難しいほうの漢字)
-----------------------------------------------
IE %26%2340407%3B
Firefox %8F%EC%BF
Opera %26%2340407%3B


おお!
やっと差異が現れました。バイト列の意味は

文字         EUCバイト列         Unicodeコードポイント
---------------------------------------------------
鷗 %8F%EC%BF U+9DD7(10進だと40407)
& %26
# %23
; %3B


です。
つまりFirefoxは素直に補助漢字として送り出しているが、IEとOperaは &#number; という
HTMLの数値文字参照で送り出していることが分かる。

このサポートしていない文字はHTMLの文字参照に変換してしまう。という実装。
いつごろから出てきたのかどうも記憶がはっきりしない(だれか教えて)が、ひどくスジの悪い実装である。

人間が手で「鷗」 と入力しても「鷗」と入力したのにブラウザが勝手に変換したのでもまったく同じバイト列に変換されてしまって受け取り側で判別不可能であるからだ。
これによって、HTMLのPOST文字列は構造を持たないプレーンテキストだよん。という理念が失われてしまっていると思う。

とはいえ、現在のWebをみるとそもそもPOSTするのは、Web掲示板とBlogが圧倒的なわけで、
現状をよく見ている。ともいえる。

さて、この送出方法の違いがユーザーにどういう影響を与えるだろうか?

・数値文字参照はすべてのブラウザが理解できる
・補助漢字はWindows APIではサポートされない

の2つのルールから
IEで書いたコメントはIEでもFirefoxでもきちんと見られるが、Firefoxで書いたコメントはFirefoxでしか見れないという結論が導かれる。

うーん、だめですねー。フォックス君
いくら補助漢字がEUCの規格的にOKと言っても、相手が理解できない形式で通信を送らないのは相互運用性(Interoperability)の基本ですよ。


次、EUCでは絶対表現できない文字列(ハングル)
これは、「もしかしてFirefoxってPOST時に勝手に数値文字参照に変換」することをまったくサポートしていないブラウザなん?
と疑問に思ったから。
脱線気味だけど、ゆるして

なおハングルを日本語版Windows標準のIMEで入力することは出来ないが、韓国のサイトなどを表示させて、そこからカット&ペーストで文字列コピーしてくることは出来る。
ブラウザが内部Unicodeで動いているおかげである。

書き込み文字列   한글(ハングルって意味だ)
-----------------------------------------------
IE %26%2354620%3B%26%2344544%3B
Firefox %26%2354620%3B%26%2344544%3B
Opera %26%2354620%3B%26%2344544%3B


すべて同じ。
ちなみに、

文字       Unicodeコードポイント
---------------------------------------------------
한 U+D55C(10進で54620)
글 U+AE00(10進で44544)



ね。
ここから、なかなか楽しい結論が導き出される。

現在のBlog環境では、Unicodeがサポートしているありとあらゆる文字が入力・表示できるが、JIS X 212(補助漢字)の範囲だけはFirefoxで入力すると文字化けする。
なお、補助漢字というと漢字だけのようなイメージがあるが、実際にはフランス語のéなどのアクセント付きアルファベットが収録されているのでヨーロッパ系の文字はほぼ全滅(ギリシャ・ロシアはJIS X 208収録なのでセーフ)


・・・・・ダメじゃん( ̄ー ̄)y━・~~~



と、ゆーわけで


ブログ界の文字化けは、あまり単純ではない。
それを何とかする為に我々はプロジェクト「セーブ・ザ・鷗外」を立ち上げることを、ここに宣言する。

活動内容は以下の通り
・文字化け状況の確認。ブラウザが何を送っていてサーバー側でどう変換しているのか
・ブラウザのバグを回避するためのツールなどをユーザーに提供
・ブログ運営会社(はてななど)に文字化けを防ぐためのライブラリやその適切な使い方をコンサル(勝手にw


本家レガシーエンコーディングプロジェクトがオープンソースのソフトがレガシーエンコーディングをまったくサポートしてない事が多い状況をなんとかしよう。というプロジェクトなのに対して、こちらはそれが解決した上でどう使っていったらみんなが幸せになれるかを追求していくプロジェクトです。

なお、参加者はいつでも大募集中です。よろしく!



なお、以下のエントリには多大な影響をうけたので感謝の意を表明したい

未来のいつかの日記: ①(まるいち)という文字
未来のいつかの日記: 文字コードヲタク
numa's diary: 補助漢字
浅倉卓司@blog風味?: はてなもそろそろEncode::EUCJPMSを使ってくれないかなあ
もじのなまえ: Unicodeはなんの役に立つのか?


P.S.
プロジェクト名はもちろん「セーブ・ジ・アース」のパクリなんだけど
こんな↓
森鴎外
いかついオッサンが「たすけてー」と泣いている様は想像するだに楽しいのでこうしてみた。
これが「セーブ・ザ・まるいち」ではこうはいかない(ある意味シュールで楽しいかも)