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)
文責・権利等は諸注意のページによります。
