ミケネコ研究所 / 文字コードの部屋 / Unicode のエンコーディング

Unicode のエンコーディング

UTF (UCS Transformation Format)

Unicode を扱うためのエンコーディング法の総称です。


UTF-7

電子メールにおいて Unicode を用いたいときに使います。電子メールは、7 bit 文字が前提の環境で用いられるので、Unicode を UTF-7 によって 7bit 文字にエンコードするのです。

エンコード方法:

                    Table 1: The Base64 Alphabet
           bits  encode  bits encode  bits encode  bits encode
           000000  A    010000  Q    100000  g    110000  w
           000001  B    010001  R    100001  h    110001  x
           000010  C    010010  S    100010  i    110010  y
           000011  D    010011  T    100011  j    110011  z
           000100  E    010100  U    100100  k    110100  0
           000101  F    010101  V    100101  l    110101  1
           000110  G    010110  W    100110  m    110110  2
           000111  H    010111  X    100111  n    110111  3
           001000  I    011000  Y    101000  o    111000  4
           001001  J    011001  Z    101001  p    111001  5
           001010  K    011010  a    101010  q    111010  6
           001011  L    011011  b    101011  r    111011  7
           001100  M    011100  c    101100  s    111100  8
           001101  N    011101  d    101101  t    111101  9
           001110  O    011110  e    101110  u    111110  +
           001111  P    011111  f    101111  v    111111  /

変換例

Unicode: My name is サーブル !

UTF-7: My name is +MLUw/DDWMOs- !

UTF-7 は、1994/7月に RFC 1642 (現在は Obsolete )として規格化され、1997/5月に RFC 2152 として再規格化されました。


UTF-8

Unicode は、ASCIIの制御コード領域 (00h〜20h、7Fh)をも利用してしまいます。このままでは従来の情報処理系で扱いにくいので、UTF-8 は Unicode を非 ASCII 領域 (80h〜FFh) のみを使ってエンコードします。

UCS-2 の範囲では、
UCS-2 UTF-8 エンコード後のサイズ
U+0000 〜 U+007F [0x00〜0x7F] 1 byte (直接エンコード)
U+0080 〜 U+07FF [0xC0〜0xDF] + [0x80〜0xBF] が 1 個 2 bytes
U+0800 〜 U+FFFF [0xE0〜0xEF] + [0x80〜0xBF] が 2 個 3 bytes

のようになり、ASCII だけからなる文書は今までどおり変わりませんが、日本語などは 1 文字約 3 バイトとなります。

ひどいことに、UCS-4 の範囲を UTF-8 でエンコードすると、

UCS-4 UTF-8 エンコード後のサイズ
U+00010000 〜 U+001FFFFF [0xF0-0xF8] + [0x80〜0xBF] が 3 個 4 bytes
U+00200000 〜 U+03FFFFFF [0xF8-0xFB] + [0x80〜0xBF] が 4 個 5 bytes
U+04000000 〜 U+7FFFFFFF [0xFC-0xFD] + [0x80〜0xBF] が 5 個 6 bytes

のように、エンコード後のサイズが尋常でなく膨れ上がり、生の UCS-4 よりずっと大きくなります。UCS-4 の領域が使われるのはまだまだ先なので、問題を先送りしていると考えられます。

特徴

1996/10月にRFC-2044(現在は Obsolete )として規格化され、1998/1月にRFC-2279として再規格化されました。

付録: UCS2/4 → UTF-8 へのエンコード方法

00 - 7F   (ASCII)
    0xxxxxxx 
0080 - 07FF
    110xxxxx 10xxxxxx 
0800 - FFFF
    1110xxxx 10xxxxxx 10xxxxxx 
00010000 - 001FFFFF
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
00200000 - 03FFFFFF
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
04000000 - 7FFFFFFF
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 

xxx の部分は、UCS を 2進数であらわして代入します。

RACE

Row-based ASCII Compatible Encoding for IDN.

多国語ドメインを扱うために、UNICODE 文字を ASCII 文字に変換するエンコーディングです。マルチバイトは、"bq--" + BASE32 を施された UTF-16 文字列で表現しますが、若干の圧縮がかかっています。

以下に RACE のエンコーディングアルゴリズムを紹介します。

Base32 テーブル

ビット並びを a〜z および 2〜7 の ASCII 32 文字に変換します。変換表は以下です。

                    Table 1: Base32 conversion
             bits   char  hex         bits   char  hex
             00000   a    0x61        10000   q    0x71
             00001   b    0x62        10001   r    0x72
             00010   c    0x63        10010   s    0x73
             00011   d    0x64        10011   t    0x74
             00100   e    0x65        10100   u    0x75
             00101   f    0x66        10101   v    0x76
             00110   g    0x67        10110   w    0x77
             00111   h    0x68        10111   x    0x78
             01000   i    0x69        11000   y    0x79
             01001   j    0x6a        11001   z    0x7a
             01010   k    0x6b        11010   2    0x32
             01011   l    0x6c        11011   3    0x33
             01100   m    0x6d        11100   4    0x34
             01101   n    0x6e        11101   5    0x35
             01110   o    0x6f        11110   6    0x36
             01111   p    0x70        11111   7    0x37

例1: http://www.ミケネコ研究所.jp:

「ミケネコ研究所」を Unicode 変換後は、"U+30DF" "U+30B1" "U+30CD" "U+30B3" "U+7814" "U+7A76" "U+6240"です。上位オクテットはバラバラであるから圧縮できる余地はありません。圧縮していないことを示す 0xD8 を先頭に置きます。

D8-30DF-30B1-30CD-30B3-7814-7A76-6240 を bit 列に直すと、11011000 00110000 11011111 00110000 10110001 00110000 11001101 00110000 10110011 01111000 00010100 01111010 01110110 011000100 1000000 である。これを BASE32 の表で変換し、

                                                BASE 32
--------------------------------------------------------
11011 00000 11000 01101 11110 01100 00101 10001 3ayn6mfr
00110 00011 00110 10011 00001 01100 11011 11000 gdgtbm3y
00010 10001 11101 00111 01100 11000 10010 00000 cr5hmysa

デコードされた RACE コード: http://www.bq--3ayn6mfrgdgtbm3ycr5hmysa.jp

例2: http://www.こんにちは.jp:

「こんにちは」を Unicode 変換後は、"U+3053" "U+3093" "U+306B" "U+3061" "U+306F" です。上位オクテットは 0x30 共通なので、これは畳み込むことができます。上位オクテット 0x30 を先頭におき、下位オクテットシーケンスを並べます。

30-53-93-6B-61-6F を bit 列に直すと、00110000 01010011 10010011 01101011 01100001 01101111 で、これを BASE 32 エンコードを施すと、

                                                BASE 32
--------------------------------------------------------
00110 00001 01001 11001 00110 11010 11011 00001 gbjzg23b
01101 111                                       n4

デコードされた RACE コード: http://www.bq--gbjzg23bn4.jp

例3: http://www.柿染NET.jp:

「柿染NET」を Unicode 変換後は、"U+67FF" "U+67D3" "U+004E" "U+0045" "U+0054"です。上位オクテットは 0x67 または 0x00 であるので、0x67 は畳み込むことができます。

上位オクテット 0x67 のすべては省略します。上位オクテット 0x00 は、0xFF に変換します。また、下位オクテットに含まれる 0xFF は、0xFF99 に変換します。

67-FF99-D3-FF4E-FF45-FF54 を bit 列に直すと、 01100111 11111111 10011001 11010011 11111111 01001110 11111111 01000101 11111111 01010100 である。これを BASE32 の表で変換し、

                                                BASE 32
--------------------------------------------------------
01100 11111 11111 11001 10011 10100 11111 11111 m77ztu77
01001 11011 11111 10100 01011 11111 11010 10100 j37ul72u

デコードされた RACE コード: http://www.bq--m77ztu77j37ul72u.jp

RACE は、2000/10月 に Internet Draft として提案されました。現在規格化が待たれています。


文字コードの部屋 http://mikeneko.creator.club.ne.jp/~lab/kcode/
お問い合わせ <lab@mikeneko.ne.jp>