JIS X 0213の符号化方式のうち、パソコンでよく使われるもの3種類を説明します。2004年に発行された追補1 (JIS X 0213:2004、通称JIS2004)に対応しています。
なお、規格本体に定義されている6種類の符号化方式については、姉妹編の「JIS X 0213のあまり代表的でないかもしれない符号化方式」をご参照ください。
文字コードの構造(ISO/IEC 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はISO 2022に準拠した構造をしており、以下のような割り当てを行った文字コードです。
ここでG2を括弧に入れてあるのは原則として使用しないためです。従来のEUC-JPとの互換性のためだけに割り当てられています。
GLには常にG0 (ASCII)が呼び出されています。つまり0x20〜0x7fは常にASCII。
GRには通常G1が呼び出されています。つまり、0xa1〜0xfeは2バイトでJIS X0213の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を付けると覚えておけばよいでしょう。
0x7f以下のバイトは、文脈によらず常にASCII (1バイトコード)です。
0xa1〜0xfeのバイトは、通常は1面の文字を表す2バイトコードを構成します (第1バイトも第2バイトも同じ範囲のバイト値であることに注意)。ただし、
構造の違いはありません。中に何が (どんな文字が) 入っているかの違いだけです。
従来EUC-JPをフルサポートしていたプログラムは、ほとんど何もせずともEUC-JIS-2004を扱えることが多いでしょう。ただし、JIS X 0212に対応していなかったプログラムは、SS3に対応させる必要があります。
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バイトになります。
上記のエスケープシーケンスによります。文字を表すバイトの範囲は1バイト文字も2バイト文字も同じなので、エスケープシーケンスが無いと見分けがつきません。
エスケープシーケンスの違いだけです。
Shift_JIS-2004は、JIS X 0201の8ビットコードの隙間に無理矢理JIS X0213 を詰め込んだコードです。従来の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)は、以下による:
第2バイト(S2)は、以下による:
2バイトコードの第1バイトになるのは以下の範囲です。
それ以外のバイトは1バイトコードおよび保留域です。保留域となるバイトは0x80、0xa0、0xfd、0xfe、0xffです。
なお、2バイトコードの2バイト目になる範囲は以下の通りです。1バイトコードの範囲と重なっているので注意が必要です。バイト列の途中の1バイトだけ取り出しても1バイトコードか否かを判断できません。
従来空き領域だったコードポイントを文字として使用。特に、2バイトコードの第1バイトに0xf0〜0xfcの範囲を使用して2面の文字を割り当てています。
厳密には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でJIS X 0213と同等の文字を扱う際には、従来JIS X 0208の範囲をUnicodeで処理していたのとは異なる問題が生じます。
サロゲート・ペアや結合文字は以前からUnicodeにあったとはいうものの、従来日本語を処理する際には必要でなかったので、対応していないプログラムが多いでしょう。「1文字 = 16ビット」という前提 (Javaでいえば、1文字が1つのchar) では、最早正しく動作しません。ユーザプログラムの立場からは、同じ「Unicode」という名前とはいえ、新たな符号化方式に変更になったと考えた方が良いかもしれません。
以上は全て規格の附属書に記述されている符号化方式です。このほか規格本体にも符号化方式はあるのですが、パソコンではあまり使われないので割愛します (姉妹編を参照ください)。とはいえ、EUC-JIS-2004は実質的に本体の「国際基準版・漢字用8ビット符号」と同じなのですが。
(面)区点番号は参照用の番号であり、符号化方式ではありません。符号化表現(バイト列)は区点番号から求められますが、区点番号自体は符号化表現ではないのです。市販の本の中には区点番号を「区点コード」と呼んでEUCやシフトJISと同列の符号化方式として分類しているものがありますが、基礎的な理解を欠いているという批判を免れないでしょう。
規格票は、日本規格協会の「JSA Web Store」からオンラインで購入できます。また、日本工業標準調査会のサイトで本文を閲覧することもできます。
この文書の前の版から以下の点を変更しました。
この文書の前の版から以下の点を変更しました。
この文書の前の前の版から以下の点を変更しました。
この文書の前の前の前の版を公開したのち、2004年に追補1が発行されてJIS X 0213が改正されたことを受けて、以下の点を変更しました。
その他、