UTF-8(7)

名前
UTF-8 - ASCII と互換性のある多バイト Unicode の符号化

説明
ユニコード(Unicode) 文字集合は16ビットのコード空間を占めている。最も単純な Unicode の 符号化( UCS-2として知られている) は16ビット・ワードで構成されている。その文字列は '\0' や '/' のようなファイル名や C のライブラリ関数で特殊な意味を持つバイトを 含んでいる場合がある。更に、ASCII を期待する大多数の UNIX ツールは 大幅な変更なしには 16ビット・ワードを読むことができない。これらの 理由により UCS-2 はファイル名やテキスト・ファイル、環境変数など外部の Unicode の符号化としては不適切である。 ISO 10646 Universal Character Set (UCS), は Unicode のスーパーセットで 31ビットのコード空間を占めており、その 最も単純な符号化 UCS-4 は (32ビット・ワード列として)同じ問題がある。 Unicode と UCS の UTF-8 符号化はこれらの問題がなく、Unix形式の OS のもとで Unicode 文字集合を使用する方法である。

性質
UTF-8 符号化は以下のような素晴しい性質を持っている:

*   UCS 文字のうち 0x00000000 から 0x0000007f まで (古典的な US-ASCII の文字)は(ASCII との互換性のために)単純に 0x00 から 0x7f のバイトに 符号化する。これは 7ビット ASCII 文字のみを含むファイルや文字列に 関しては ASCII と UTF-8 で同じ符号化を行なうことを意味する。

*   0x7f より大きいの全ての UCS 文字は 0x80 から 0xfd までの範囲のバイトのみを含む多バイト文字列 に符号化される。ASCII でないバイトにはこれらのバイトしか含まれな いので '\0' や '/' の問題は発生しない。

*   UCS-4 の辞書的ソートの順序は保存される。

*   全ての可能な 2^31 UCS コード を UTF-8 を使用して符号化できる。

*   UTF-8 符号化では 0xfe と 0xff のバイトは絶対に使用しない。

*   ASCII でない UCS の文字の多バイト列の最初のバイトは常に 0xc0 から 0xfd の範囲で表現 されその文字が何バイトで構成されているかを示している。残りの多バイト 列は 0x80 から 0xbf の範囲である。これは同期を容易にし、符号を ステートレスにし、バイトの紛失に対して堅固にする。

*   UTF-8 を使用した UCS 文字の符号化は最大 6バイトの長さになる。しかし Unicode 文字は最大でも 3バイトにしかならない。Linux では UCS のサブセットである16 ビット Unicode のみが使用できる。Linux では UTF-8 多バイト列は 1バイトか 2バイトか 3バイトの長さになる。

符号化
以下のバイト列は文字を表現するのに使用され、 どれを使用するかは文字の UCS コード番号に依存している:

0x00000000 - 0x0000007F:
    0xxxxxxx

0x00000080 - 0x000007FF:
    110xxxxx 10xxxxxx

0x00000800 - 0x0000FFFF:
    1110xxxx 10xxxxxx 10xxxxxx

0x00010000 - 0x001FFFFF:
    11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

0x00200000 - 0x03FFFFFF:
    111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

0x04000000 - 0x7FFFFFFF:
    1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

xxx ビットの部分は2進数で表わした文字コードのビット部分が対応する。 その文字を表現するのに最も短いバイト列のみが使用できる。

例
Unicode 文字の 0xa9 = 1010 1001 (コピーライト・マーク) は UTF-8 で符号化すると

    11000010 10101001 = 0xc2 0xa9
になる。

0x2260 = 0010 0010 0110 0000 (不等号)は

    11100010 10001001 10100000 = 0xe2 0x89 0xa0
になる

準拠
ISO 10646, Unicode 1.1, XPG4, Plan 9.

著者
Markus Kuhn <mskuhn@cip.informatik.uni-erlangen.de>

関連項目
unicode(7)