2012年5月15日火曜日

続・Unicodeで天下統一

Unicodeの話その2。

UTF-32は、Unicodeの1文字を32ビット固定長の値で表すもの。これはまあ、そのまんま。
UTF-32もBOM(U+FEFF)でエンディアンの判別はできるが、そもそも、ファイルやネットワークでのやり取りはUTF-32に不向き。サイズは食うが扱いは容易なUTF-32の得意なポジションは、多言語対応プログラムの内部文字コード。

UTF-8は、Unicodeの1文字を下の表のように1~4バイトの可変長バイト列で表すもの。

UnicodeUTF-8(bin)
U+0000~U+007F0xxxxxxx
U+0080~U+07FF110xxxxx 10xxxxxx
U+0800~U+FFFF1110xxxx 10xxxxxx 10xxxxxx
U+10000~U+1FFFFF11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

U+007F以下はそのまま1バイトで符号化されるので、この部分はASCIIコードと互換性がある。
U+0080以上はマルチバイトで符号化されるが、マルチバイト文字の各バイトは全てMSBが1。なので、Shift_JISのようにマルチバイト文字の一部がASCIIの他の文字に見えてしまうことはない。
マルチバイト文字の1バイト目は、その文字が何バイトなのかも表している。具体的には、最上位ビットから並んでいる1の数が、その文字のバイト数となる。なお、このルールだと5バイト以上のバイト列も表現できるが、Unicodeでそれは不正という扱い。

UTF-8はバイト列なので、エンディアンの問題はない。

0 件のコメント:

コメントを投稿