JIS X 0213の代表的な符号化方式 JIS X 0213の符号化方式のうち、パソコンでよく使われるもの3種類を説明 します。 文字コードの構造(ISO 2022)の基礎知識については、『 文字コードの世界』のよう な参考書を参照してください。G0, G1, GL, GR といった用語の理解が必要です。ウ ェブで読める解説では「文字コードの話」の第4章がよいでしょう。 以下、0xで始まる数は16進表記です。 * 文字表の構成 * EUC-JISX0213 * ISO-2022-JP-3 * Shift_JISX0213 ------------------------------------------------------------------------ 文字表の構成 JIS X 0213の文字表は、ISO 2022に則った94×94の表が2面あるという構成 になって います。 * 1面: JIS X 0208の上位互換の表 (非漢字、漢字第1〜第3水準) * 2面: 第4水準漢字のみからなる表 94×94の表の行と列 (規格の用語ではそれぞれ区と 点と呼びます) が、符号化表現 の第1・第2バイトにそれぞれ 対応します。文字表の中の位置は、面番号と区番 号と 点番号の組み合わせで示されます。これを 面区点番号と呼びます。普通、面区点番 号は、各番号をハ イフンでつないで、1-14-6 (1面14区6点)のように表します。 文字表はISO-IRのサイトから入手できます(PDF版)。 次の節から、具体的な符号化方式の説明に入ります。 EUC-JISX0213 EUC-JISX0213はISO 2022に準拠した構造をしており、以下のような割り当 てを行っ た文字コードです。 * G0にISO/IEC 646 IRV (要するにASCII) * G1にJIS X 0213の1面 * (G2にJIS X 0201の片仮名) * G3にJIS X 0213の2面 ここで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を付けると覚えておけばよいでしょう。 2バイトコードの見分け方 0x7f以下のバイトは、文脈によらず常にASCII (1バイトコード)です。 0xa1〜0xfeのバイトは、通常は1面の文字を表す2バイトコードを構成しま す (第1バ イトも第2バイトも同じ範囲のバイト値であることに注意)。ただし、 * 直前のバイトが0x8eだったら、JIS X 0201片仮名を表す1バイトコードです。 * 直前のバイトが0x8fだったら、2面の文字を表す2バイトコードの1バイト 目で す。 EUC-JPとの違い 構造の違いはありません。中に何が (どんな文字が) 入っているかの違い だけで す。 * G1がJIS X 0208でなくJIS X 0213の1面: つまり、従来空き領域だった コード ポイントも文字として使用 * G3がJIS X 0212でなくJIS X 0213の2面 従来EUC-JPをフルサポートしていたプログラムは、ほとんど何もせずとも EUC-JISX0213を扱えることが多いでしょう。ただし、JIS X 0212に対応してい なか ったプログラムは、SS3に対応させる必要があります。 ISO-2022-JP-3 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と同じ) * 初期状態はASCII。つまり、ファイルの先頭のバイト列は (それがエスケー プ シーケンスでなかったら) ASCIIの文字列を表します。 * 改行コード(CRLF; 即ち、0x0d 0x0aの2バイト)が現れるのはASCIIの状態の と きに限る。つまり、改行の前でASCIIに戻しておく必要があります。 * 情報交換の終了はASCIIの状態のときに限る。つまり、ファイルの最後では ASCIIに戻しておく必要があります。 余談になりますが、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バイトになります。 2バイトコードの見分け方 上記のエスケープシーケンスによります。文字を表すバイトの範囲は1バイ ト文字も 2バイト文字も同じなので、エスケープシーケンスが無いと見分けが つきません。 ISO-2022-JPとの違い エスケープシーケンスの違いだけです。 * JIS X 0213の1面・2面のエスケープシーケンスを導入 * 83JISのエスケープシーケンスを一部制限 (上記「1b 24 42」) * 78JISのエスケープシーケンスを廃止 (「1b 24 40」) * JIS X 0201のエスケープシーケンスを廃止 (「1b 28 4a」) Shift_JISX0213 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)は、以下による: 1. m = 1 で 1 ≦ k ≦ 62 のとき, S1 = (k + 0x101) ÷ 2. 2. m = 1 で 63 ≦ k ≦ 94 のとき, S1 = (k + 0x181) ÷ 2. 3. m = 2 で, k = 1, 3, 4, 5, 8, 12, 13, 14, 15 のとき, S1 = (k + 0x1df) ÷ 2 − (k ÷ 8) × 3. 4. m = 2 で, 78 ≦ k ≦ 94 のとき, S1 = (k + 0x19b) ÷ 2. 第2バイト(S2)は、以下による: 1. k が奇数の場合: 1. 1 ≦ t ≦ 63 のとき, S2 = t + 0x3f. 2. 64 ≦ t ≦ 94 のとき, S2 = t + 0x40. 2. k が偶数の場合, S2 = t + 0x9e. 2バイトコードの見分け方 2バイトコードの第1バイトになるのは以下の範囲です。 * 0x81〜0x9f, 0xe0〜0xfc それ以外のバイトは1バイトコードおよび保留域です。保留域となるバイト は0x80、 0xa0、0xfd、0xfe、0xffです。 なお、2バイトコードの2バイト目になる範囲は以下の通りです。1バイトコー ドの範 囲と重なっているので注意が必要です(バイト列の途中の1バイトだけ取 り出しても1 バイトコードか否かを判断できない)。 * 0x40〜0x7e, 0x80〜0xfc Shift_JISとの違い 従来空き領域だったコードポイントを文字として使用。特に、2バイトコー ドの第1 バイトに0xf0〜0xfcの範囲を使用して2面の文字を割り当てています。 ------------------------------------------------------------------------ 蛇足 以上は全て規格の附属書に記述されている符号化方式です。このほか規格 本体にも 符号化方式はあるのですが、パソコンではあまり使われないので割愛 します。とは いえ、EUC-JISX0213は実質的に本体の「国際基準版・漢字用8ビッ ト符号」と同じな のですが。 蛇足2 (面)区点番号は参照用の番号であり、符号化方式ではありません。符号化 表現(バイ ト列)は区点番号から求められますが、区点番号自体は符号化表現で はないのです。 市販の本の中には区点番号を「区点コード」と呼んでEUCやシ フトJISと同列の符号 化方式として分類しているものがありますが、基礎的な 理解を欠いているという批 判を免れないでしょう。 ------------------------------------------------------------------------ 関連規格、文献、URL * JIS X 0201-1997 * JIS X 0202:1998 * JIS X 0208:1997 * JIS X 0213:2000 * 人文学と情報処理 (26), 特集「文字コード論から文字論へ」, 勉誠出版 * JISX0213 InfoCenter ------------------------------------------------------------------------ 2000年11月 矢野啓介 (yano@moon.email.ne.jp) 文責・権利等は諸注意のページによります。