JIS X 0213の符号化方式のうち、パソコンでよく使われるもの3種類を説明 します。
文字コードの構造(ISO 2022)の基礎知識については、『 文字コードの世界』のような参考書を参照してください。G0, G1, GL, GR といった用語の理解が必要です。ウェブで読める解説では「文字コードの話」の第4章がよいでしょう。
以下、0xで始まる数は16進表記です。
JIS X 0213の文字表は、ISO 2022に則った94×94の表が2面あるという構成 になっています。
94×94の表の行と列 (規格の用語ではそれぞれ区と 点と呼びます) が、符号化表現の第1・第2バイトにそれぞれ 対応します。文字表の中の位置は、面番号と区番 号と点番号の組み合わせで示されます。これを 面区点番号と呼びます。普通、面区点番号は、各番号をハ イフンでつないで、1-14-6 (1面14区6点)のように表します。
文字表はISO-IRのサイトから入手できます(PDF版)。
次の節から、具体的な符号化方式の説明に入ります。
EUC-JISX0213はISO 2022に準拠した構造をしており、以下のような割り当 てを行った文字コードです。
ここでG2を括弧に入れてあるのは原則として使用しないためです。従来 のEUC-JPとの互換性のためだけに割り当てられています。
GLには常にG0 (ASCII)が呼び出されています。つまり0x20〜0x7fは常にASCII。
GRには通常G1が呼び出されています。つまり、0xa1〜0xfeは2バイトでJIS X 0213の1面の文字を表します。
ただし、SS3 (0x8f)でGRにG3を呼び出します。この呼び出しは直後1文字分 だけ有効で、その次の文字からはまたG1に戻ります。G3に割り当てられている 文字集合(JIS X 0213の2面)は2バイトコードなので、SS3の直後にきた2バイト (0xa1〜0xfeの範囲)が2面の文字を表すことになります。2面の文字が連続する 場合でも、1文字ごとにSS3で呼び出す必要があります。
また、SS2 (0x8e)でGRにG2を呼び出します。この呼び出しは1文字分だけ有 効で、次の文字からはまたG1に戻ります。ただし、前述の通り、G2は原則とし て使用しません。
なお、従来のEUC-JPはG3にJIS X 0212補助漢字を割り当てていました。こ こでJIS X 0213の2面が衝突していますが、JIS X 0213は補助漢字と重ならな い範囲に文字を定義しているので、補助漢字かJIS X 0213かを見分けることが できます。(同時に使用するという意味ではない)
面区点番号からEUC-JISX0213の第1・第2バイトを求めるのは簡単です。 区番号に0xa0を足せば第1バイトに、点番号に0xa0を足せば第2バイトになります。 2面の文字はその直前に0x8fを付けると覚えておけばよいでしょう。
0x7f以下のバイトは、文脈によらず常にASCII (1バイトコード)です。
0xa1〜0xfeのバイトは、通常は1面の文字を表す2バイトコードを構成しま す (第1バイトも第2バイトも同じ範囲のバイト値であることに注意)。ただし、
構造の違いはありません。中に何が (どんな文字が) 入っているかの違い だけです。
従来EUC-JPをフルサポートしていたプログラムは、ほとんど何もせずとも EUC-JISX0213を扱えることが多いでしょう。ただし、JIS X 0212に対応してい なかったプログラムは、SS3に対応させる必要があります。
ISO-2022-JP-3は7ビットのコードで、G0へ文字集合を指示するエスケープ シーケンスによってGLの文字集合を切り替えます。(つまり、GLにG0を呼び出し た状態が固定されており、G0への指示によって文字集合の切り替えを実現する)
指示のエスケープシーケンスは以下の表の通りです。ここで「文字表記」 は、各バイトを便宜的にASCIIの文字で表わしたものです。
符号化文字集合 | 16進表記 | 文字表記 |
---|---|---|
ISO/IEC 646 IRV (要するにASCII) | 1b 28 42 | ESC ( B |
JIS X 0213の1面 | 1b 24 28 4f | ESC $ ( O |
JIS X 0213の2面 | 1b 24 28 50 | ESC $ ( P |
ただし、ISO-2022-JPとの互換性のため、1面の指示には「1b 24 42」を使 うこともできます。この指示を行った状態では、規格票の附属書2表1(64ペー ジ) にある文字を使用することはできません〔編注: 表を自作する予定〕。使っ てはいけない文字は、JIS X 0208に無い文字、包摂規準が変更された文字が中 心です。これらの文字を表すには必ず「1b 24 28 4f」の指示を使わなければ なりません。
さらに、状態について以下の規則があります。(ISO-2022-JPと同じ)
余談になりますが、Mule-UCSでサポートされるEmacsのコーディングシステム “iso-2022-jp-3-strict”は、規格に適合する範囲でできる限り「1b 24 42」 を使って符号化する方式です。これを使って符号化したテキストは、 ISO-2022-JPにしか対応していないソフトウェアでもある程度読むことができ ます。常に「1b 24 28 4f」を使うと、このエスケープシーケンスを知らないプ ログラムでは漢字が全く表示できません。(参考: 『JIS X 0213の特徴と、Emacs上での実装』)
なお、ISO-2022-JP-3は、ISO-2022-JP-2 (RFC 1554)の上位互換ではありま せん。
面区点番号からISO-2022-JP-3の第1・第2バイトを求めるのは簡単です。区 番号に0x20を足せば第1バイトに、点番号に0x20を足せば第2バイトになります。
上記のエスケープシーケンスによります。文字を表すバイトの範囲は1バイ ト文字も2バイト文字も同じなので、エスケープシーケンスが無いと見分けが つきません。
エスケープシーケンスの違いだけです。
Shift_JISX0213は、JIS X 0201の8ビットコードの隙間に無理矢理JIS X 0213 を詰め込んだコードです。従来のShift_JISとの互換性を保った構造になっ ています。前述のEUC-JISX0213やISO-2022-JP-3とは異なり、ISO 2022に整合 的ではありません。
コード値0x20〜0x7fはJIS X 0201ラテン文字、0xa0〜0xdfはJIS X 0201 片 仮名と同じです。JIS X 0213の文字はややこしい入り方をしています。詳細は 以下で述べますが、おおまかにいうと「第1バイトを縮めて、第2バイトを広げ る」ような方法です。第1バイトを縮めないとJIS X 0201の隙間に入りきらな いのです。
面区点番号からShift_JISX0213の第1・第2バイトは以下の通り求められます。
面番号を m、区番号を k、点番号を t とする。また、記号 ÷ は整数除算 (小数点以下切捨て)を表す。
第1バイト(S1)は、以下による:
第2バイト(S2)は、以下による:
2バイトコードの第1バイトになるのは以下の範囲です。
それ以外のバイトは1バイトコードおよび保留域です。保留域となるバイト は0x80、0xa0、0xfd、0xfe、0xffです。
なお、2バイトコードの2バイト目になる範囲は以下の通りです。1バイトコー ドの範囲と重なっているので注意が必要です(バイト列の途中の1バイトだけ取 り出しても1バイトコードか否かを判断できない)。
従来空き領域だったコードポイントを文字として使用。特に、2バイトコー ドの第1バイトに0xf0〜0xfcの範囲を使用して2面の文字を割り当てています。
以上は全て規格の附属書に記述されている符号化方式です。このほか規格 本体にも符号化方式はあるのですが、パソコンではあまり使われないので割愛 します。とはいえ、EUC-JISX0213は実質的に本体の「国際基準版・漢字用8ビッ ト符号」と同じなのですが。
(面)区点番号は参照用の番号であり、符号化方式ではありません。符号化 表現(バイト列)は区点番号から求められますが、区点番号自体は符号化表現で はないのです。市販の本の中には区点番号を「区点コード」と呼んでEUCやシ フトJISと同列の符号化方式として分類しているものがありますが、基礎的な 理解を欠いているという批判を免れないでしょう。