UTF-16
UTF-16はUnicodeの可変長符号化形式で、符号位置あたり2バイトまたは4バイトを使用する。BMPの文字は1つの16ビット符号単位、追加面の文字はサロゲートペア(2単位)で表する。
目的
BMP文字が中心の環境(Windows APIやJavaの内部文字列表現)で、空間効率とUnicode全体のカバーのバランスを取る。
メカニズム
BMPの符号位置(U+0000-FFFF)は1つの16ビット単位としてそのまま格納される。追加面の符号位置(U+10000-10FFFF)は0x10000を減算した上で、0xD800と0xDC00をオフセットとした上位・下位の10ビットずつに分割してサロゲートペアを構成する。バイト順はBOM(U+FEFF)で示される。
ユースケース
- Windows APIでの内部文字列表現
- Java/JavaScriptにおける内部文字列表現
- .NETのStringの内部格納
- ファイル名(NTFS)の格納
例
- 入力
AOutput0x00 0x41UTF-16BE, 2 bytes
- 入力
😀Output0xD8 0x3D 0xDE 0x00A surrogate pair, 4 bytes
よくあるエラー
- Ignoring surrogate pairs, producing wrong character counts
- Use code-point-aware APIs or surrogate-pair-aware iteration
関連用語
Unicode
Unicode は国際的な文字符号化標準で、世界中のほぼすべての文字体系の各文字に一意の符号位置(U+0000〜U+10FFFF)を割り当てる。符号空間は 1,114,112 点である。 用語集
UTF-8
UTF-8はUnicodeの可変長符号化形式で、符号位置あたり1~4バイトを使用する。ASCIIと完全な後方互換性があり、ウェブと現代のシステムの事実上の標準である。 用語集
Surrogate Pair
サロゲートペアは、補助平面のコードポイント(U+10000~U+10FFFF)を 2 個の 16 ビットコードユニットで表す UTF-16 の仕組みである。 用語集
BOM
BOM(バイトオーダーマーク)は Unicode 文字 U+FEFF であり、テキストストリームの先頭に置いて符号化形式とバイト順を示す。 用語集
Endianness
エンディアンはメモリ上での複数バイト値の並び順である。ビッグエンディアンは最上位バイトを先頭に、リトルエンディアンは最下位バイトを先頭に格納する。 用語集