UTF-32とは、Unicodeの文字符号化形式/文字符号化方式の一つである。
概要
UTF-32とは、Unicodeの文字符号化形式/文字符号化方式の一つで、Unicodeの21ビットを表現するのに32ビット(=4バイト)あれば十分だろうということで、全て4バイト固定長で表現する方式である。ただ、異体字セレクタなど、前の文字と結合して用いるものがあるので、完全な1単位1文字は実現できていない。
UTF-8なら1バイトで表現できる英数字にも4バイトを消費する反面、コードポイント数*4バイトが長さに一致するので、何番目と指定された文字に高速にアクセスできるという利点がある。
Unicodeは21ビットまでなので、先頭のバイト(厳密には11ビット)は常に0になり、メモリの無駄が多いので使用される場面は少ない。
Unicodeの符号位置を表記するのにU+の後に16進数を続ける書式があるが、UTF-32ではこの16進数がそのまま格納される。
バイトオーダーマーク
UTF-16と同様である。UTF-32BE, UTF-32LEではバイトオーダーマークは使用禁止。無印 UTF-32では、00 00 FE FFはビッグエンディアン、FF FE 00 00はリトルエンディアン、省略されるとビッグエンディアンと解釈される。
また、Unicodeの各面におけるFF FEで終わる符号位置U+?FFFE(?は0-10(16))はUTF-32でリトルエンディアンになると、FE FF 0x 00となり、UTF-16のBOMありビッグエンディアンと区別が難しくなるため使用しないことになっている。
関連項目
コラム: UTF-24?
Unicodeの文字は21ビットで表現可能である。8ビット(=1バイト)単位になるのは仕方がないとしても、24ビット(=3バイト)あれば十分なはずで、32ビット(=4バイト)もいらないのではないだろうか。
当時主流の32ビットコンピューターではデータのやり取りを行う単位が32ビット(1つのメモリアドレスに保持するデータは32ビット)であった。24ビットという中途半端な単位では、下記の2文字目のように、1文字3バイトが1バイト+2バイトといった形で2つのアドレスに分かれて保管されてしまう。
アドレス単位 | 1 | 2 | 3 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
バイト単位 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
文字単位 | 1 | 2 | 3 | 4 |
2つのアドレスに分かれて保管された場合、ランダムアクセスで読み出す時にも2つのアドレスへのアクセス(+ 有効部分のバイトデータ切り出し + 結合)が必要となり、1メモリアドレスにアクセスするだけで読み出せるUTF-32に比べて倍以上の時間が必要になる。
固定長方式はアクセス速度向上のためならメモリ容量の無駄をいとわないようなシビアな局面での使用が想定されるため、格段に速度が低下するUTF-24は不採用になったようだ。
この点、UTF-8は可変長なので1文字のデータがアドレスの境界をまたぐのは日常茶飯事なのだが、UTF-8はそもそも可変長ゆえにアドレスを指定してのランダムアクセスができないので、こういう意味でのパフォーマンス向上には意味がないと言える。
- 0
- 0pt