第3章 JISエンコーディング
JIS(漢字)コードという俗称は、次の二つの意味で使われています。
- JIS X 0208をコード空間に呼び出した状態でのビット組み合わせ
- 1 をASCIIなどと共存させるために、ISO 2022 準拠の指示のエスケープシーケンスなどを用いるエンコーディング法
たとえば、「亜という字のJISコードは0x3021だ」といった場合は前者ですし、「このHTMLファイルはJISコードを使っている」といった場合は後者です。シフトJISや日本語EUCについても同じことが言えます。
ここでは、JISエンコーディングについて、もう少し考えてみましょう。
前記のJIS X 0208 のように、実際のビット組み合わせを直接規定していない符号化文字集合を運用する場合には、符号と実際のビット組み合わせとの対応を規定する必要が生じます。また、シフト JIS において JIS 漢字コードを変換しているように、何らかの理由により符号を変換して実際のビット組み合わせを求めることもあります。このように、符号化文字集合の符号と実際のビット組み合わせとの対応を決定する方法のことを、エンコーディング法といいます。JIS では JIS X 0202 で規定しています。JIS X 0202 は ISO 2022 を日本国内の規格として規定したもので、世界の多くの符号化文字集合を対象としたエンコーディング法です。
ISO 2022 で定義されるエンコーディング法は、7単位または8単位系の符号空間(インユーステーブル(in-use table))と、G0 から G3 までの4つの中間バッファを持ち、まず、「中間バッファ」を指定し、そこへ特定の「符号化文字集合(JIS X 0208等)」を指示します(イメージ的にはロードするようなもの)。中間バッファは4種類あるので、使いたい中間バッファの全てに指示を行います。次に特定の中間バッファをインユーステーブル(7単位は GL のみ、8単位は GL, GR の2つ)へ呼び出します(イメージ的にはリンク)。使用する符号化文字集合を切り替えたい場合には「別の中間バッファを呼び出す」、「別の符号化文字集合を現在呼び出し中の中間バッファへ指定する」という方法と、「1文字だけ例外的に別の中間バッファ中の1文字を呼び出す(シングルシフト)」という方法があります。
図3-1 ISO 2022 のインユーステーブル(8単位系)
概念での説明はわかりにくいので、実例を見てみましょう。
JISエンコーディングは次のようになります。
ISO 2022 に準拠したエンコーディング法で、7単位または8単位系の符号空間(インユーステーブル(in-use table))と、G0 から G3 までの4つの中間バッファを持ち、インユーステーブルおよび中間バッファを次のように使用しています。
- G0 に JIS X 0201 ローマ文字(または ASCII)を指示
- G1 に JIS X 0201 カタカナを指示
- G0 を GL に呼び出す
- JIS X 0208漢字(および他の文字集合)は G0 に指示して使用
- 7ビット環境では、JIS X 0201カタカナは、G1 を GL に呼び出すか、直接 G0 に指示して使用
- シングルシフトは使わない
図3-2 JIS エンコーディング の構造(8単位系)
呼び出しの制御機能の表現は、C0 制御文字・C1 制御文字・単独の制御機能と多岐にわたっています。単独の制御機能とは、制御文字集合に含まれない制御機能をエスケープシーケンス ESC 0x60~0x7E で表現するものです。
制御機能 | 符号 | 符号の区分 | |
---|---|---|---|
ロッキングシフト(左) | SI/LS0 | 0x0F | C0 制御文字 |
SO/LS1 | 0x0E | ||
LS2 | ESC 0x6E | 単独の制御機能 | |
LS3 | ESC 0x6F | ||
ロッキングシフト(右) | LS1R | ESC 0x7E | 単独の制御機能 |
LS2R | ESC 0x7D | ||
LS3R | ESC 0x7C | ||
シングルシフト | SS2 | 0x8E | C1制御文字 |
SS3 | 0x8F |
JIS エンコーディングでは、区または点番号の1~94は、0x21~0x7Eとして表現されます。
文字 | 区点コード | 符号値 |
---|---|---|
「 」 | 0101 | 0x2121 |
「◆」 | 0201 | 0x2221 |
「亜」 | 1601 | 0x3021 |
ちなみに、ASCIIコードは次のように規定されており、0x21~0x7Eは印字可能文字となります。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
0 | <NUL> | <DLE> | <SP> | 0 | @ | P | ` | p |
1 | <SOH> | <DC1> | ! | 1 | A | Q | a | q |
2 | <STX> | <DC2> | " | 2 | B | R | b | r |
3 | <ETX> | <DC3> | # | 3 | C | S | c | s |
4 | <EOT> | <DC4> | $ | 4 | D | T | d | t |
5 | <ENQ> | <NAK> | % | 5 | E | U | e | u |
6 | <ACK> | <SYN> | & | 6 | F | V | f | v |
7 | <BEL> | <ETB> | ' | 7 | G | W | g | w |
8 | <BS> | <CAN> | ( | 8 | H | X | h | x |
9 | <HT> | <EM> | ) | 9 | I | Y | i | y |
A | <LF> | <SUB> | * | : | J | Z | j | z |
B | <VT> | <ESC> | + | ; | K | [ | k | { |
C | <FF> | <FS> | , | < | L | \ | l | | |
D | <CR> | <GS> | - | = | M | ] | m | } |
E | <SO> | <RS> | . | > | N | ^ | n | ~ |
F | <SI> | <US> | / | ? | O | _ | o | <DEL> |
JIS コードの利点の一つは、7ビットの伝送路でも伝送できることです。また、エスケープシーケンス中の<Esc>を除けば前記のとおりASCIIコードの印字可能文字として認識することもできます。未だに7ビットの伝送路が残るインターネットのメールやニュースでJIS コードが使われている理由もここにあります。しかし、エスケープシーケンスの存在が厄介ですので、コンピュータ内部のデータ処理ではあまり使われません。
e.g. 文字列「かな漢字a」をJIS X 0202(ISO 2022)に従い符号化すると次のようになります。
文字列 | かな漢字a |
エスケープシーケンス | <Esc>$Bかな漢字<Esc>(Ja |
コード値 | 1B 24 42 242B 244A 3441 3B7A 1B 28 4A 61 |
ASCII文字 | .$B$+$J4A;z.(Ja |
※ASCII文字で表示できないコードは"."とした
動作の説明は次のようになります。
- エスケープシーケンスにより「G0 にJIS X 0208-1997」を指示 (G0 の呼び出しは既に行われていると仮定)
- 第一バイトの"24"から"4区"が指定された事を認識
- 第二バイトの"2B"から"11点"が指定された事を認識 (文字"か")
- ...略...
- エスケープシーケンスにより「G0 にJIS X 0201 ラテン文字集合」を指示
- "61"を認識 (文字"a")