CESU8
Compatibility Encoding Scheme for UTF-16: 8-bit
Unicodeのコードポイントを1,2,3または6バイトのシーケンスにエンコーディングする
「サロゲートペア」で表現した2文字の16bit Unicodeをそれぞれ個別にUTF-8に変換して、最終的に3bytes×2=6bytesのデータにする。
UTF-16を8 bit文字で表現したい場合に内部的に使われる 非標準的なエンコーディング方法なので理由がない限り採用してはいけない
アルゴリズム
モチベーション
UTF-8ではU+10000からU+10FFFFを符号化すると4 byteになる 4 byte UTFに対応していないシステムでも扱いたい!では、どうすればいいか?
UTF-16は文字を2 byte固定長で表現する体系なので、U+10000からU+10FFFFの範囲はサロゲートペアを利用している これを16 bitの文字の範囲に収めたい
0xD800から0xDFFFに納めればいい
実例で学ぶアルゴリズム
U+10437 (𐐷)をCESU8でエンコード
1. 0x10437から0x10000を引く
0x00437
→0000 0000 0100 0011 0111
2. 上位と下位10bitに分割する
0000 0000 01 / 00 0011 0111
→0x0001 / 0x0037
3. 上位サロゲートに 0xD800を加える
0x0001 + 0xD800 = 0xD801
4. 下位サロゲートに 0xDC00を加える
0x0037 + 0xDC00 = 0xDC37
資料