参照処理モデル

参照処理モデル (Web)

[3] Web文字コードに関する参照処理モデル (Reference Processing Model) とは、 Unicode を用いて規定を定め、実際に使われている文字コードはその Unicode の文字列を符号化したものとみなす、というものです。

[4] 実装は必ずしもこのモデルに従う必要はありませんが、従っているかのように振る舞うことが求められています。

[5] このモデルは HTML 2.x (RFC 2070) で導入され、 HTML4CSS2ECMAScriptDOM1XML などその後の Web 関連技術に広がっていきました。

[10] 例えば HTML4SGML 文書文字集合ISO/IEC 10646 (≒ Unicode) でした。 HTML文書UTF-8 でも UTF-16 でも Shift_JIS でも ISO-8859-1 でも構いませんが、 いずれにせよ Unicode に変換してから解釈される、とされていました。

[16] 現在の Web文字コードに関する仕様である Encoding Standard も、基本的にはこの方針の延長線上にあります。

参照処理モデルに従う仕様

[19] 明示的または暗示的に参照処理モデルに従っていた仕様には、次のものがありました。

文字コードの種類

[20] 参照処理モデルに従う仕様は IANA charset によって文字コードの指定が行えるのが普通でしたが、 実際には IANA charset として登録されていないものも使われていました。 いずれにせよ、参照処理モデルとしては文字コードの種類は限定されていませんでした。

[21] ただし概念上 Unicode として扱うという性質から、 Unicode で表現できない文字は扱うことができません。 (Unicode で表現できない文字を含む文字コードを扱うことはできますが、 Unicode で表現できない文字U+FFFD などに対応付けられているものとみなすことになります。)

[22] より後の時代の仕様は文字コードUnicode のみに限定していることがあります。 更に時代が下ると UTF-8 のみとするのが一般的になります。

文字参照

[23] 参照処理モデルの確立以前は文字参照の意味は曖昧でした。 たとえ仕様上何らかの意味が定められていたとしても、 それは便宜上たまたまそう記述されたといってよく、 実態を反映したものではありませんでした。 しかし参照処理モデルにより、文字参照Unicode における符号位置を表していることが明確になりました。

[24] 90年代中頃には、実体参照すら意味は曖昧で、Latin1 のつもりで使われた実体参照シフトJISで同じバイトで表される半角カナの意味で使われたり、表示されたりすることまでありました。

[25] HTML文字参照Unicode文字を表すとされたのに対し、 URLパーセント符号化バイトを表すとされ、 意味が分岐しました。

文字コードの意味の変化

[8] 参照処理モデルは、既存の文字コードの意味を変化させました。従来の文字コードは、 含まれる文字の集合も定義も、その符号化方式も独自に定義していました。参照処理モデルはその独自の集合と定義を無視し、 どの文字コードUnicode という単一の符号化文字集合符号化方式の違いに過ぎないものと読み替えていきました。

[9] 例えば JIS X 0208:1997 は 0x89 0xA8 (に相当する JIS区点位置) に とを包摂していますから、 Shift_JIS の本来の定義からすると 0x89 0xA8 はでもでもある (文字コードでは区別されない) と解釈できます。 ところが UnicodeはまったくべつのUnicode符号点に割り当てられた異なる文字です。 文字集合 Unicode および文字符号化方式 Shift_JIS の定義を組み合わせると 0x89 0xA8 に相当する Unicode文字です。 従って参照処理モデルに従う解釈では 0x89 0xA8 はでしかありません。

[28] この意味で、 「JIS X 0208:1997 の規定するシフト符号化表現」と 「参照処理モデルにおける Shift_JIS」 は別の文字コードとも解釈できます。

歴史

[6] 参照処理モデルの確立以前は、仕様は Latin-1 (ISO-8859-1) ベースに定義されていることが多く、 一方で実装はその動作するシステムの文字コードで実装されていて、 いくつかの文字コードの変換にも対応している、といった感じでした。

[17] 文書はそれぞれの著者の環境で表示確認されるため、 それぞれのシステムの文字コードが使われることとなり、 同一言語圏で複数の文字コードが使われている場合や、 他の言語圏の文書を閲覧しようとした場合には文字化けが多発していました。

[11] 例えば日本語版Windows 95 で動作する Netscape Navigator 1 は、 シフトJIS (CP932) で実装されていました。EUC-JPISO-2022-JP の表示にも対応していましたが、 ISO-8859-1 には対応しておらず、シフトJIS として解釈されて半角カナ文字化けしました。

[12] 当時の正式な仕様であった HTML 2.0HTML 3.2ISO-8859-1SGML 文書文字集合としていましたが、 欧米ではそう実装されているだけであって、 実態とは異なっていました。 (日本語その他欧米以外の文字コードHTML 2.0 より前に既に広く用いられていました。)

[27] HTML 2.0HTML 3.2 では日本語文字を使えないという解釈が00年代初期に流行したことがありますが、 「HTMLSGML応用である」という虚構と同様に、その時代の制約のもとでの標準化の限界と捉えるべきでしょう。

[26] 現在の JavaScript/DOM内部コードUTF-16 としていますが、 初期の JavaScript はその Webブラウザー内部コード、 すなわちそのシステムの内部コードで動作していました。

[13] 参照処理モデルが仕様化 >>2 された当時 (90年代末) は実データの Unicode への統一はまだ現実的ではありませんでした。 仕様上は Unicode が中心となっていましたが (他に世界中の文字を扱うための現実的な選択肢はありませんでした)、 それに限定するには時期尚早すぎました。

[7] 90年代末には WindowsNT 系に移行してゆき、 UCS-2/UTF-16 を内部コードにして WWin32 API を使う実装が (Webブラウザーに限らず) 増えていきました。他のシステムでも同様に Unicode の普及が進み、 自然と参照処理モデルに沿った実装に収束していきました。

[18] W3CI18N Core WG は後に charmod において改めて参照処理モデルを文書化しています >>1

[14] 参照処理モデルから10年以上が経過して、 Webの文字コードはようやく Unicode に収束しつつあります。2011年の Encoding Standard は新しいプロトコル言語UTF-8 の利用を義務付けています。

[15] この間、 IETFW3C のポリシーは参照処理モデルUTF-8UTF-16 などに対応しないといけない (他もあってよい) → UTF-8UTF-16 などに限定するべきと徐々に限定されていきました。 00年代後半になって UTF-32 が利用実態がないとして HTML で使用禁止になり、 UTF-16ASCII互換でないため Encoding Standardレガシー符号化に分類されています。