ISO-20220-JP/EUC-JP/Shift-JISなど

概要

JIS X 0208の符号化方式として以下の3つを整理する。

  • ISO-2022-JP~JISコード
  • EUC-JP
  • Shift_JIS

ISO-2022-JP

JIS X 0208の符号化

区点番号を16進4桁とし、0x2020を加えて2バイトのバイト列を得る。以下、いくつかの例。

全角文字 区点(10進) 区点(16進) 符号化後
4/2 0x0402 24 22
4/21 0x0415 24 35
16/1 0x1001 30 21
28/79 0x1C4F 3C 6F

エスケープシーケンス

ASCII文字の解釈で始め、ASCIIにエスケープした状態で終了。

以下は文字集合、バッファーとそれに切り替えるためのエスケープシーケンス。

文字集合 バッファー 16進 文字表記
ASCII G0 1B 28 42 ESC ( B
JIS X 0201 G0 1B 28 4A ESC ( J
JIS X 0208 G0 1B 24 42 ESC $ B

以下は、「ABアイあい」という文字列のISO-2022-JPによるエンコーディングの結果。

区/点 バイト表現 変換・制御 バイト列
A 41 41
B 42 42
C 43 43
JIS X 0201 1B 28 4A
B1 B1
B2 B2
JIS X 0208 1B 24 42
4/4 0404 +0x2020 24 24
4/5 0405 +0x2020 24 25
ASCII 1B 28 42

EUC-JP

EUC-JPでは以下のようにエンコードする。

  • ASCIIをGL領域、JIS X 0208をGR領域で扱う
  • ASCIIは最上位ビットが0でそのままのビットパターン
  • JIS X 0208は区点コードに0xA0A0を加えた値となる
  • 半角カタカナ(JIS X 0201)はSS2 (Single Sift 2, 0x8E)で1文字ごとにエスケープ
  • 補助漢字(JIS X 212)はSS3 (Single Shift 3, 0x8F)で1文字ごとにエスケープ

なお、区の最大値は84(0x54)、点の最大値は95(0x5F)なので、0xA0を加えてもオーバーフローしない。

全角文字 区点(10進) 区点(16進) 符号化後
4/2 0x0402 A4 A2
4/21 0x0415 A4 B5
16/1 0x1001 B0 A1
28/79 0x1C4F BC EF

エスケープ

JIS X 0201とJIS X 0212の文字の前、1文字ごとにそれぞれエスケープシーケンス0x8E0x8Fを置く。ASCIIとJIS X 0208は同居しているので、エスケープシーケンスは必要ない。

以下は文字集合、バッファーとそれに切り替えるためのエスケープシーケンス。ただしJIS X 0201とJIS X 0212へのエスケープの実装は任意。

文字集合 バッファー 16進 文字表記
ASCII G0
JIS X 0208 G1
JIS X 0201 G2 8E SS2
JIS X 0212 G3 8F SS3

以下は、「ABアイあい」という文字列のEUC-JPによるエンコーディングの結果。

区/点 バイト表現 変換・制御 バイト列
A 41 41
B 42 42
C 43 43
JIS X 0201 8E
B1 B1
JIS X 0201 8F
B2 B2
JIS X 0208 1B 24 42
4/4 0404 +0xA0A0 A4 A4
4/5 0405 +0xA0A0 A4 A5

Shift_JIS

概要

英数字・半角カナ・漢字をエスケープシーケンスなしで1~2バイトの符号空間で表現する。

  • 半角英数字と半角カタカナは1バイト
  • 日本語の全角文字は2バイト

Shift_JISのシフトは、文字集合を符号空間の空き領域にシフトさせて詰め込んでいることから。

特徴など

  • エスケープシーケンス不要
  • 符号化後の容量が他と比べて小さい
  • JIS X 0208の区点からの変換式が煩雑
  • 2バイト目にASCIIコードと同じ符号が現れるため、文字区切りの判定に制約
    • 一部の文字に0x5Cが現れ、これがASCIIのバックスラッシュ/¥記号に相当するため、ソースコードの処理などで不都合が生じる、など