目次> 第8章> 8.5 TOPUPPREVNEXT

8.5 エンコード

7ビット符号

8.3節の最後に述べたように、 「 7ビット及び8ビットの情報交換用符号化文字集合 JIS X 0201-1997 」 の 8ビット空間の文字集合を、 シフトアウトとシフトインを用いて7ビット幅で表現する方法です。

JIS

区番号を1バイト目、点番号を2バイト目にした、16ビットの符号とするのですが、 区点番号に16進の 20 を加えておくGL領域用符号と、 16進の A0 を加えておく GR領域用符号の2種類があります。以下に例を掲げます。 区点番号を16進表示することは一般的でないのですが、JIS符号との関連を示すために掲げています。

字形 コード(16進)
(10進)(16進)(10進)(16進) GLGR
03031913 2333A3B3
03036541 2361A3E1
04040101 2421A4A1
04040202 2422A4A2
16100101 3021B0A1
16100202 3022B0A2
16100303 3023B0A3
16100404 3024B0A4
16100505 3025B0A5
23172436 3744B7C4
56387046 5866D8E6
1711945E 317EB1FE
84540404 7424F4A4

Shift−JIS

1バイト目 81〜9F ... 31 ヶ所
      E0〜EF ... 16 ヶ所 計 47
2バイト目 40〜7E ... 63 ヶ所
      80〜FC ... 125 ヶ所 計 188 ―― 47 × 188 = 8836 = 94 × 94

  1. 区 が 1〜61 で奇数の場合、区 に 257を加えて 2で割った値を 1バイト目にする。
    点 が 1〜63 なら 63 を加えた値を、そうでなければ64を加えた値を 2バイト目にする。
  2. 区 が 2〜62 の偶数の場合、区 に 256を加えて、2で割った値を1バイト目にする。
    点に 158 を加えた値を 2バイト目にする。
  3. 区 が 63〜93の奇数の場合、区 に 385 を加えて2で割った値を1バイト目にする。
    点 が 1〜63であれば、63を加えた値、そうでなければ64を加えた値を2バイト目にする。
  4. 区 が 64〜94の偶数の場合、区 に 384 を加えて2で割った値を1バイト目にする。
    点 に 158 を加えた値を 2バイト目にする。

字形 コード(10進)コード SJIS
1バイト目2バイト目
0319 130828252
0365 1301298281
0401 48653041
0402 48663042
1601 136159889F
1602 13616088A0
1603 13616188A1
1604 13616288A2
1605 13616388A3
2324 140998C63
5670 1562289CE4
1794 137158899E
8404 234162EAA2

ISO-2022-JP

ISO-2022 という部分だけに注目すると混乱するかもしれません。 ISO-2022複数の文字集合 を切り替えながら組み合わせて使う枠組みです。 JIS では、JIS X 0202:1998ISO-2022 と同等の規格を定めています。 非常に大掛かりな枠組みで、 JIS や EUC-JP あるいは ここで解説する ISO-2022-JP などを包含しています。

ISO-2022-JP はこの枠組みの中で、以下のようなエスケープシーケンスを用いて(「指示」や「呼び出し」を行い)、 ASCII、X 0201 ローマ字、X 0208漢字 を7ビットで扱おうというものです。

文字種エスケープシーケンス(16進)エスケープシーケンス(文字表現)
ASCII1B  28  42ESC  (  B
JIS ローマ字1B  28  4AESC  (  J
JIS カナ
旧JIS1B  24  40ESC  $  @
新JIS1B  24  42ESC  $  B

以下の約束があります。

ファイルのダンプ例が、 平成14年度質問と回答 2 の最後にあります。

EUC-JP

エンコーディング符号長字種 例 コード
ASCIIそのまま1バイトA 41
JIS基本漢字GR領域2バイト A4 A2
JISカナ8Eでシングルシフト2バイト 8E 41
JIS補助漢字8Fでシングルシフト3バイト 8F EC BF

UTF-16LEUTF-16BE

UCS-2 あるいは 16ビットのユニコード をそのまま符号にしたものです。 16ビットをバイトの列として、外部媒体や通信回線に送り出す際に、 16ビットの上8ビットを先に送り出す(ビッグエンディアン)か、 下8ビットを先に送り出すか(リトルエンディアン) の2種類のエンコーディングがあります。 Windows では通常リトルエンディアン( UTF-16LE )が使われます。 UTF-16 とは異なり、テキストの先頭にエンディアンを区別する BOM が付きません。

UTF-16

以下の方法で2バイトまたは4バイトに符号化されます。

UCS-2( 群00 面00 )の部分は16ビットをそのまま符号にします。

群00 の 面01 から 面10(第16面)については、 サロゲートペアとよばれる2つの16ビットの組で1文字の符号とします。

16進表示で 00 01 00 00 〜 00 10 FF FF の文字から 01 00 00 を引いて 00 00 00 00 〜 00 0F FF FF の範囲にします。 この20ビットの上10ビットに D800 を足して (といっても繰り上がりはおきない)できた16ビットを1つ目、 下10ビットに DC00 を加えてできた16ビットを2つ目とします。 ビット表示で表すと下図のようになります。

lec-n19-utf16-a.gif

サロゲートペアに使うために、 UCS-2 の D800 〜 DFFF には文字が割り当てられていません。 このことにより、D8〜DB で始まる16ビットはサロゲートの上位、 DC〜DF で始まる16ビットはサロゲートの下位と判定され、逆変換が可能となります。

UCS-4の残りの部分(群00面11〜群7F面FF)については UTF-16 ではエンコードされません。

各々の16ビットをバイト列に変換する方法として、 16ビットの上8ビットを先に送り出す(ビッグエンディアン)か、 下8ビットを先に送り出すか(リトルエンディアン) の2種類のエンコーディングがあります。

ファイルの先頭、あるいは通信の最初にBOM とよばれる文字が付加されることがあります。 BOM によって、ビッグエンディアンかリトルエンディアンかを判定することができます。 BOM がない場合は、ビッグエンディアンと判定されます。

ファイル・ダンプの例(UTF-16)

UTF-8

7ビットASCII と重なる部分を1バイトで表現し、残りの文字を2〜4バイトで表現しようというものです。

コードポイント1バイト目2バイト目3バイト目4バイト目
00000000 0xxxxxxx0xxxxxxx    
00000yyy yyxxxxxx110yyyyy 10xxxxxx  
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy10xxxxxx  
000uuuuu zzzzyyyy yyxxxxxx11110uuu 10uuzzzz10yyyyyy 10xxxxxx

ひらがなが \u3040〜 、カタカナが \u30A0〜 、 CJK統合漢字が \u3400〜 ですから、漢字は3バイトになります。

\uD800 〜 \uDFFF はサロゲートペアのためのコードポイントであり、エンコードの対象外です。 \u110000 以上の部分もエンコードの対象外です。

ファイル・ダンプの例(UTF-8)

以上が、Unicode 4.0UTF-8 の定義です。 JIS X 0221-1 の「 付属書D(規定) UCS変換形式8 (UTF-8) 」 では、 5〜6バイト長の場合も定義されていて次のようになっています。

オクテットの用途形式(2進数)自由ビット数最大UCS-4値
1オクテットの列の最初0xxxxxxx 0000 007F
2オクテットの列の最初110xxxxx 0000 07FF
3オクテットの列の最初1110xxxx 0000 FFFF
4オクテットの列の最初11110xxx 001F FFFF
5オクテットの列の最初111110xx 03FF FFFF
6オクテットの列の最初1111110x 7FFF FFFF
継続オクテット(2〜6番目)10xxxxxx  

修正UTF-8

Javaの入出力で使われることのある修正UTF-8 (Java modefied UTF-8) は次のようなものです。

UTF-32

1文字を32ビットで表現します。 (16進で) 00 00 00 〜 00 D7 FF および 00 00 00 〜 10 FF FF を そのまま32ビット幅で表現します。 ( 抜けている部分はサロゲートペアのためのコードポイントで、文字ではありません。 10 FF FF を越える部分もエンコードの対象ではありません。)

エンディアンの問題だけが残ります。 たとえば、ABC で始まるバイト列を例にすると次のようになります。

メモリ上の値
32ビットワード
エンコーディングバイト列
00000041
00000042
00000043
UTF-32BE00 00 00 41 00 00 00 42 00 00 00 43
UTF-32LE41 00 00 00 42 00 00 00 43 00 00 00
UTF-32
ビッグエンディアン
00 00 FE FF 00 00 00 41 00 00 00 42 00 00 00 43
UTF-32
リトルエンディアン
FF FE 00 00 41 00 00 00 42 00 00 00 43 00 00 00
UTF-32
BOM なし
00 00 00 41 00 00 00 42 00 00 00 43


更新日:2013/12/09 TOPUPPREVNEXT