JIS X 0213の代表的な符号化方式

〜2004年改正 (JIS2004) 対応版〜

JIS X 0213の符号化方式のうち、パソコンでよく使われるもの3種類を説明 します。2004年に発行された追補1 (JIS X 0213:2004、通称JIS2004)に対応しています。

なお、規格本体に定義されている6種類の符号化方式については、姉妹編の 「JIS X 0213のあまり代表的でないかもしれない 符号化方式」をご参照ください。

文字コードの構造(ISO 2022)の基礎知識については、『 文字コードの世界』のような参考書を参照してください。G0, G1, GL, GR といった用語の理解が必要です。ウェブで読める解説では「文字コードの話」の第4章がよいでしょう。

以下、0xで始まる数は16進表記です。

[*1] これらの符号化方式名の末尾「-2004」は JIS X 0213:2004の発行当時、編集上の誤りで「-2003」と印刷されていましたが、 訂正票が発行されて「-2004」に訂正されました。


文字表の構成

JIS X 0213 (JIS2004) の文字表は、ISO 2022に則った94×94の表が2面あるという構成 になっています。

94×94の表の行と列 (規格の用語ではそれぞれと呼びます) が、符号化表現の第1・第2バイトにそれぞれ 対応します。文字表の中の位置は、面番号区番 号点番号の組み合わせで示されます。これを 面区点番号と呼びます。普通、面区点番号は、各番号をハ イフンでつないで、1-14-6 (1面14区6点)のように表します。

文字表はISO-IRのサイトからPDF形式のものを入手できます。番号233が1面 (2004年版)、 229が2面の文字表です。1面の2000年版は228番として登録されています。

次の節から、具体的な符号化方式の説明に入ります。

EUC-JIS-2004

EUC-JIS-2004は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-JIS-2004は、この規格の2000年版では「EUC-JISX0213」と命名されて いました。

コード値の算出

面区点番号からEUC-JIS-2004の第1・第2バイトを求めるのは簡単です。 区番号に0xa0を足せば第1バイトに、点番号に0xa0を足せば第2バイトになります。 2面の文字はその直前に0x8fを付けると覚えておけばよいでしょう。

2バイトコードの見分け方

0x7f以下のバイトは、文脈によらず常にASCII (1バイトコード)です。

0xa1〜0xfeのバイトは、通常は1面の文字を表す2バイトコードを構成しま す (第1バイトも第2バイトも同じ範囲のバイト値であることに注意)。ただし、

EUC-JPとの違い

構造の違いはありません。中に何が (どんな文字が) 入っているかの違い だけです。

従来EUC-JPをフルサポートしていたプログラムは、ほとんど何もせずとも EUC-JIS-2004を扱えることが多いでしょう。ただし、JIS X 0212に対応してい なかったプログラムは、SS3に対応させる必要があります。

ISO-2022-JP-2004

ISO-2022-JP-2004は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 51 ESC $ ( Q
JIS X 0213の2面 1b 24 28 50 ESC $ ( P

(1面の終端バイト51は、この規格の2000年版のISO-2022-JP-3では4fでした)

ただし、ISO-2022-JPとの互換性のため、1面の指示には「1b 24 42」を使 うこともできます。この指示を行った状態では、規格票の附属書2表1(64ペー ジ) および追補1の附属書2表2 (追補1の20ページ)にある文字を使用することはできません〔編注: 表を自作する予定〕。使っ てはいけない文字は、JIS X 0208に無い文字、包摂規準が変更された文字が中 心です。これらの文字を表すには必ず「1b 24 28 51」の指示を使わなければ なりません。

また、ISO-2022-JP-3との互換性のため、1面の指示には「1b 24 28 4f」を 使うこともできます。このときは、追補1の附属書2表2 (追補1の20ページ)に ある文字を使用することはできません。

さらに、状態について以下の規則があります。(ISO-2022-JPと同じ)

余談になりますが、Mule-UCSでサポートされるEmacsのコーディングシステム “iso-2022-jp-3-strict”は、規格に適合する範囲でできる限り「1b 24 42」 を使って符号化する方式です。これを使って符号化したテキストは、 ISO-2022-JPにしか対応していないソフトウェアでもある程度読むことができ ます。常に「1b 24 28 51」を使うと、このエスケープシーケンスを知らないプ ログラムでは漢字が全く表示できません。(参考: 『JIS X 0213の特徴と、Emacs上での実装』)

なお、ISO-2022-JP-2004は、ISO-2022-JP-2 (RFC 1554)の上位互換ではありま せん。

この符号化方式は、この規格の2000年版ではISO-2022-JP-3と命名されてい ました。2004年改正で1面の終端バイトが変更された点が違いとなっています。

コード値の算出

面区点番号からISO-2022-JP-2004の第1・第2バイトを求めるのは簡単です。区 番号に0x20を足せば第1バイトに、点番号に0x20を足せば第2バイトになります。

2バイトコードの見分け方

上記のエスケープシーケンスによります。文字を表すバイトの範囲は1バイ ト文字も2バイト文字も同じなので、エスケープシーケンスが無いと見分けが つきません。

ISO-2022-JPとの違い

エスケープシーケンスの違いだけです。

Shift_JIS-2004

Shift_JIS-2004は、JIS X 0201の8ビットコードの隙間に無理矢理JIS X 0213 を詰め込んだコードです。従来のShift_JISとの互換性を保った構造になっ ています。前述のEUC-JIS-2004やISO-2022-JP-2004とは異なり、ISO 2022に整合 的ではありません。

コード値0x20〜0x7fはJIS X 0201ラテン文字、0xa0〜0xdfはJIS X 0201 片 仮名と同じです。JIS X 0213の文字はややこしい入り方をしています。詳細は 以下で述べますが、おおまかにいうと「第1バイトを縮めて、第2バイトを広げ る」ような方法です。第1バイトを縮めないとJIS X 0201の隙間に入りきらな いのです。

この符号化方式は、この規格の2000年版ではShift_JISX0213と命名されて いました。

コード値の算出

面区点番号からShift_JIS-2004の第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バイトになるのは以下の範囲です。

それ以外のバイトは1バイトコードおよび保留域です。保留域となるバイト は0x80、0xa0、0xfd、0xfe、0xffです。

なお、2バイトコードの2バイト目になる範囲は以下の通りです。1バイトコー ドの範囲と重なっているので注意が必要です。バイト列の途中の1バイトだけ取 り出しても1バイトコードか否かを判断できません。

Shift_JISとの違い

従来空き領域だったコードポイントを文字として使用。特に、2バイトコー ドの第1バイトに0xf0〜0xfcの範囲を使用して2面の文字を割り当てています。

Unicodeとの対応

厳密にはJIS X 0213の符号化方式ではありませんが、関係があるので Unicode (ISO/IEC 10646 UCS, JIS X 0221)との対応について記しておきます。

JIS X 0213は、JIS X 0208と同様に、各文字についてISO/IEC 10646 (Unicode)の文字との対応を規定しています。X0208では文字名称だけの記載で したが、X0213では念を押すかのように符号位置も併記されています。

つまり、Unicodeとの間でコード変換を行う場合は、この規定に従って 変換することになります。既に、Shift_JIS-2004とUnicodeとの対応表のテキ ストファイルが有志によって公開されています。また、この文書で紹介し た3つの符号化方式全てとUnicodeと の対応表も用意されています。

ちなみに、JIS X 0213の2004年版では、2000年時にUnicodeに入ってい なかった文字について、最新版のUnicodeにおける文字名称と符号位置が記載 されています。

UnicodeでJIS2004の文字を扱う際の問題点

UnicodeでJIS X 0213と同等の文字を扱う際には、従来JIS X 0208の範囲を Unicodeで処理していたのとは異なる問題が生じます。

サロゲート・ペアや結合文字は以前からUnicodeにあったとはいうものの、 従来日本語を処理する際には必要でなかったので、対応していないプログラム が多いでしょう。「1文字 = 16ビット」という前提 (Javaでいえば、1文字 が1つのchar) では、最早正しく動作しません。ユーザプログラムの立場から は、同じ「Unicode」という名前とはいえ、新たな符号化方式に変更になった と考えた方が良いかもしれません。


蛇足

以上は全て規格の附属書に記述されている符号化方式です。このほか規格 本体にも符号化方式はあるのですが、パソコンではあまり使われないので割愛 します (姉妹編を参照ください)。とはいえ、EUC-JIS-2004は実質的に本体の「国際基準版・漢字用8ビッ ト符号」と同じなのですが。

蛇足2

(面)区点番号は参照用の番号であり、符号化方式ではありません。符号化 表現(バイト列)は区点番号から求められますが、区点番号自体は符号化表現で はないのです。市販の本の中には区点番号を「区点コード」と呼んでEUCやシ フトJISと同列の符号化方式として分類しているものがありますが、基礎的な 理解を欠いているという批判を免れないでしょう。

蛇足3

規格票は、日本規格協会の 「JSA Web Store」からオンラインで購入できます。また、日本工業標準調査会のサイトで本文を閲 覧することもできます。


関連規格、文献、URL

この文書の前の版からの変更点

この文書の前の版から以下の点 を変更しました。

この文書の前の前の版からの変更点

この文書の前の前の版から以下の点 を変更しました。

この文書の前の前の前の版からの変更点

この文書の前の前の前の版を公開したのち、2004年に追補1が発行されてJIS X 0213が改正 されたことを受けて、以下の点を変更しました。

その他、


2000年11月初版公開、2009年2月最終更新
矢野啓介 (yano AT moon. email. ne. jp)
文責・権利等は諸注意のページによります。