CESU8
Compatibility Encoding Scheme for UTF-16: 8-bit
Unicodeのコードポイントを1,2,3または6バイトのシーケンスにエンコーディングする
6バイトになるのはサロゲートペアが必要な場合
「サロゲートペア」で表現した2文字の16bit Unicodeをそれぞれ個別にUTF-8に変換して、最終的に3bytes×2=6bytesのデータにする。
UTF-8:Tech Basics/Keyword - @IT
UTF-16を8 bit文字で表現したい場合に内部的に使われる
cesu8 - Rust
非標準的なエンコーディング方法なので理由がない限り採用してはいけない
ユニコードコンソーシアムも非推奨
アルゴリズム
https://docs.rs/cesu8/1.0.0/cesu8/#surrogate-pairs-and-utf-8
以降は #WIP なので間違いがあります
モチベーション
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
資料
UTR #26: Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)
CESU-8 ‐ 通信用語の基礎知識