文字コードについて
あの変態チックな文字化けでおなじみの、日本語の文字コードについて、少し調べる機会があったので書いておく。
参考にしたサイト
http://euc.jp/i18n/charcode.ja.html
JIS X 0208
EUCであるとか、シフトJISなどを考えるときに、この規格が後々参照されるので重要。
基本的な漢字・アルファベット・仮名・数字・記号。94×94の表で定義されている。
表の行・列をそれぞれ「区」「点」と呼ぶことになっている。
1点〜94点 | |
---|---|
1区〜8区 | 数字・記号・アルファベット・仮名など |
9区〜15区 | 未定義 |
16区〜84区 | 漢字 |
85区〜94区 | 未定義 |
ISO 2022
日本語に限定されない。文字集合を切り替えて使うための仕組み。
文字集合の切り替えは2段構えになっている。
詳しくは参考サイトに丁寧に解説されている。
1バイト(オクテット)で表現できるのは、0x00〜0xFFの16x16の表ということになるが、まずここをC0, GL, C1, GRの4つの領域に分ける。(ここをIn-Use tableという。) このうち、C0, C1は制御文字が入る。
それぞれ0x00-1F, 20-7F, 80-9F, A0-FFである。
さて、ここで中間バッファという新たなものが登場する。これがおのおの96文字入る領域が4コあり、それぞれG0, G1, G2, G3という。
まず、文字集合をG0〜G3のどれかに割り振り(designation)、次にそれをIn-Use tableに呼び出す(invocation)という2段階を経て、文字集合が特定のコードに割り当てられる。
designationについては、C0の制御文字(ESC, 0x1B)を使う。その内容は、文字集合の種類により変わる。たとえば「JIS X 0201カタカナ」を「G1」にdesignateする場合は、ESC ) I
(1B 29 49)のようにである。
invocationについては、「ここから先は常にこのバッファを使う」という「ロッキングシフト」と、「次の1文字だけこのバッファを呼び出す」という「シングルシフト」の2種類がある。ちょうど、英数大文字を入力するのに、「CAPSロック」をするのか、「シフトキー」を押すのかに対応する。
ESCまたはその他のC0, C1の制御文字を使う。
EUC-JP
EUCはISO 2022に準拠している。参考ページによれば次のとおり。
* G0にASCII(またはJIS X 0201 ローマ文字)を指示
* G1にJIS X 0208 漢字を指示
* G2にJIS X 0201 カタカナを指示
* G3にJIS X 0212 補助漢字を指示
* G0をGLに、G1をGRに呼び出す
* G2とG3はシングルシフトで使用
* エスケープシーケンス・ロッキングシフトは使わない
文字コードの話, 伊藤隆幸
シフトJIS (Shift_JISやその派生)
シフトJISはISO 2022に準拠していない。(上のような切り替え方式でない)
wikipedia:Shift_JISを参照。
PCで普及していた、1バイトのいわゆる半角カナをそのままにしつつ、漢字を表現するために、JIS X 0208などのコード位置を、計算によって複雑にずらして、無理やり漢字が表現できるようにしている。
文字化けについては次のとおり。(たぶん)
有名な話だが、NECやIBMが独自に拡張した部分が存在する。機種依存文字。
その拡張部分を、計算に基づいてJIS X 0208の区点相当の位置に戻すと、元のJIS X 0208では未定義になっている区(例:13区)であるとか、そもそもISO 2022的な94区に収まらない区(120区)になってしまう。
EUCのバリエーション
シフトJISの項で述べたような拡張文字を表現するためのバリエーションがいくつか存在する。
JIS X 0208で未定義だった区に拡張されているものをそのまま使ったり、94区をオーバーする部分についてはG3に置いてシングルシフトで表現したりしている。(この場合シングルシフト+2バイトで3バイトになる)