Web上の日本語EUCデータに指定すべきエンコーディングは何か

日本語EUCは当初、G0にUS-ASCII、G1にJIS X0208-1990、G2にHalf Width Katakana、G3にユーザ定義文字が定義されていました。その後、これを拡張しつつ多くの亜種が作られました。まずはこの亜種のうちの主要なものを挙げます。

まず、日本語EUCの国家標準は結局作られませんでしたが*1、IANA Character Set Registry*2に登録されているEUC-JP*3(以下、この仕様をeucJPと呼ぶ)は「標準」にかなり近いものということができるでしょう。これはG0にUS-ASCII、G1にJIS X0208-1990、G2にHalf Width Katakana、G3にJIS X0212-1990を指定しています。つまり、このエンコーディングはJIS X 0212を収録しているのが特徴です。

次に、eucJP-open系があります。このエンコーディングは日本語EUCの系統とマイクロソフト標準 キャラクタセットの相互運用性を確保するという目的から、OSF/JVCによって作られました。その後、Unicodeとの対応表 (eucJP-ms, eucJP-0201, eucJP-ascii) が公開され、http://blog.livedoor.jp/numa2666/archives/50980727.htmlからそれを見ることが出来ます。これの特徴は、JIS X 0212に加えてWindowsの機種依存文字 (NEC特殊文字, IBM拡張文字, NEC選定IBM拡張文字) を収録していることでしょう。

以上の2つはUnixの文脈において定義されたエンコーディングですが、これとは別にWindowsの日本語EUC実装であるCP51932があります。こちらもWindowsの機種依存文字(NEC特殊文字, NEC選定IBM拡張文字)が収録されていますが、G3、つまり3バイトEUCをサポートしておらず、JIS X 0212が収録されていません。このため、eucJP-msとも異なります。[legacy-encoding.sourceforge.jp/wiki/index.php?cp51932]

なお、Ruby 1.9/transcodeでは以上のうち、EUC-JP (eucJP), eucJP-ms, CP51932が用意されています。

さて、それでは当初の問題を考えましょう。最初期のWeb上ではNetscape2.0がx-euc-jpという名前で日本語EUCを受け付けていました(要出典、由来)。その後、IANAにExtended_UNIX_Code_Packed_Format_for_Japaneseが登録され(登録したのはいつで誰?)、Netscape3.0(ほんとに3.0?)から「EUC-JP」で受け付けるようになりました。つまり、以後Webにおいて送信側は日本語EUCで符号化されたデータに「EUC-JP」として送るようになりました。

では、「EUC-JP」として送られたデータを受信したときはどのように扱えばいいのでしょう。IANA Character Set Registryの言うとおりにeucJPでしょうか。しかし、世のWebクライアントの圧倒的多数はInternet Explorerであり、彼らはCP51932なデータを「EUC-JP」として送ってきます。このデータをeucJPでは扱いきれません。リアルタイムに受信したものならばeucJPから外れるものはエラーとして蹴るとか、Microsoft社にかけあってCP51932を用いることをやめさせるという選択肢も理屈の上ではありえますが、既に受け付け、蓄積しているデータは変えられません。これらのデータをUnicodeへと変換する際に失うというのはなかなか受け入れがたいものでしょう。かといってCP51932を用いようとすると、Unix系のWebブラウザはJIS X 0212をサポートしてしまっており、これをCP51932によって変換することはできません。つまり、既存の日本語EUC系エンコーディングでは、eucJPとCP51932が混在するという十分に存在すると思われるケースに対して、救いの手段を持っていません。

このような問題に対して、各ブラウザがどう対処しているかの調査がhttp://www.asp-edita.jp/doda/one/doda5728_21.htmlhttp://www.asp-edita.jp/doda/one/doda5728_22.htmlです。Firefox、つまりMozillaはこの辺の矛盾を一身に背負っていて、単体でeucJPとCP51932の混在したデータを送受信しています。この、Mozilla版日本語EUC変換表を用いれば、先に述べたデータを扱う事ができます。

さて、Rubyはどうするべきでしょう。

*1:EUC-JP-2004?黒歴史でしょ、あれは

*2:そういえば「これ」の名前って何が正式な名前なんだろうね"IANA Charset Registry"としているものもあるんだが

*3:中身はUI-OSF日本語環境実装規約 Version 1.1 (PDF)だと思われる