文字コードについて

あの変態チックな文字化けでおなじみの、日本語の文字コードについて、少し調べる機会があったので書いておく。

参考にしたサイト
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などのコード位置を、計算によって複雑にずらして、無理やり漢字が表現できるようにしている。

文字化けについては次のとおり。(たぶん)
有名な話だが、NECIBMが独自に拡張した部分が存在する。機種依存文字
その拡張部分を、計算に基づいてJIS X 0208の区点相当の位置に戻すと、元のJIS X 0208では未定義になっている区(例:13区)であるとか、そもそもISO 2022的な94区に収まらない区(120区)になってしまう。

EUCのバリエーション

シフトJISの項で述べたような拡張文字を表現するためのバリエーションがいくつか存在する。
JIS X 0208で未定義だった区に拡張されているものをそのまま使ったり、94区をオーバーする部分についてはG3に置いてシングルシフトで表現したりしている。(この場合シングルシフト+2バイトで3バイトになる)