Unicode を扱うためのエンコーディング法の総称です。
電子メールにおいて 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 として再規格化されました。
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進数であらわして代入します。
Row-based ASCII Compatible Encoding for IDN.
多国語ドメインを扱うために、UNICODE 文字を ASCII 文字に変換するエンコーディングです。マルチバイトは、"bq--" + BASE32 を施された UTF-16 文字列で表現しますが、若干の圧縮がかかっています。
以下に RACE のエンコーディングアルゴリズムを紹介します。
エンコード後の文字列「 "bq--" + "BASE 32 ストリング" 」
ビット並びを 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 として提案されました。現在規格化が待たれています。