UTF-32は、Unicodeの1文字を32ビット固定長の値で表すもの。これはまあ、そのまんま。
UTF-32もBOM(U+FEFF)でエンディアンの判別はできるが、そもそも、ファイルやネットワークでのやり取りはUTF-32に不向き。サイズは食うが扱いは容易なUTF-32の得意なポジションは、多言語対応プログラムの内部文字コード。
UTF-8は、Unicodeの1文字を下の表のように1~4バイトの可変長バイト列で表すもの。
Unicode | UTF-8(bin) |
---|---|
U+0000~U+007F | 0xxxxxxx |
U+0080~U+07FF | 110xxxxx 10xxxxxx |
U+0800~U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
U+10000~U+1FFFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
U+007F以下はそのまま1バイトで符号化されるので、この部分はASCIIコードと互換性がある。
U+0080以上はマルチバイトで符号化されるが、マルチバイト文字の各バイトは全てMSBが1。なので、Shift_JISのようにマルチバイト文字の一部がASCIIの他の文字に見えてしまうことはない。
マルチバイト文字の1バイト目は、その文字が何バイトなのかも表している。具体的には、最上位ビットから並んでいる1の数が、その文字のバイト数となる。なお、このルールだと5バイト以上のバイト列も表現できるが、Unicodeでそれは不正という扱い。
UTF-8はバイト列なので、エンディアンの問題はない。
0 件のコメント:
コメントを投稿