WHATWG vs Unicode.org: ブラウザと規格がエンコーディングで食い違う理由
WHATWG と Unicode.org/各国規格のマッピング相違を横断的に調査。
なぜ相違が生じるのか
レガシーエンコーディングを Unicode に変換する際、複数の組織が独自にマッピングテーブルを作成しました。Unicode.org は各国規格に忠実に、Microsoft と WHATWG はブラウザの実装に従いました。
WHATWG の基本原則: 「既存の Web コンテンツを壊さない」。これはブラウザの動作を公式規格より優先することを意味します。
日本語: 7つの JIS 不一致
最も有名なマッピング問題。同じ JIS バイト位置が異なる Unicode コードポイントにマップされます:
| JIS バイト | Unicode.org | WHATWG (Microsoft) |
|---|---|---|
| 81 5F | \ (U+005C) | \ (U+FF3C) |
| 81 60 | 〜 (U+301C) | ~ (U+FF5E) |
| 81 61 | ‖ (U+2016) | ∥ (U+2225) |
| 81 7C | − (U+2212) | - (U+FF0D) |
| 81 91 | ¢ (U+00A2) | ¢ (U+FFE0) |
| 81 92 | £ (U+00A3) | £ (U+FFE1) |
| 81 CA | ¬ (U+00AC) | ¬ (U+FFE2) |
このツールでは設定から両マッピングを切り替えて違いを確認できます。
中国語: Big5 と GB18030
Big5(繁体字): WHATWG は CP950 と HKSCS を統合したハイブリッドテーブルを使用。6文字でバイト列の順序が他の実装と異なります。
GB18030(簡体字): バイト 0xA3 0xA0 は WHATWG では U+3000(全角スペース)にマップされますが、公式 GB18030 規格では U+E5E5(PUA 文字)です。2002年の Web 互換性修正に基づく決定です。
韓国語: EUC-KR のスコープ拡張
WHATWG の「EUC-KR」は実際には Windows CP949/UHC で、全 11,172 ハングル音節をカバー — 本来の KS X 1001 の約 2,350 字をはるかに超えます。
注目すべき点: Unicode.org の KSX1001.TXT は Microsoft の UHC マッピングに基づいて作成されている(ファイルヘッダーに明記)ため、韓国語では JIS のような WHATWG vs Unicode.org の相違はありません。
西欧: ISO 8859-1 → Windows-1252
WHATWG の最も影響範囲の広い決定: iso-8859-1、latin1、ascii 等のラベルは全て Windows-1252 として解釈。0x80-0x9F の27バイトが C1 制御文字ではなくタイポグラフィ文字に。
| バイト | ISO 8859-1 | Windows-1252 (WHATWG) |
|---|---|---|
| 0x80 | C1 制御文字 | € (U+20AC) |
| 0x93 | C1 制御文字 | “ (U+201C) |
| 0x94 | C1 制御文字 | ” (U+201D) |
| 0x97 | C1 制御文字 | — (U+2014) |
共通パターン
全てのエンコーディングに共通する構造:
| 作成者 | アプローチ | 優先事項 |
|---|---|---|
| 公式規格 | 各国/ISO 仕様に忠実 | 正確性 |
| Microsoft/ブラウザ | Windows コードページの動作に従う | 互換性 |
| WHATWG | ブラウザの実装を追認 | Web コンテンツ |
WHATWG はブラウザが数十年間行ってきた動作を標準化しました。「規格」と「ブラウザの動作」が一致する代わりに、元の各国規格とは乖離する結果になっています。