符号化形式
名前がないと不便なので Kanji14 形式とします。
情報文字: U+4E10 〜 U+8E0F
ネットワーク バイト順のバイト列データを 14ビット区切りにし、Unicode の範囲 U+4E10 〜 U+8E0F
に割り当てた文字列に変換します。
バイト列の14ビット区切り形式
+--------+--------+--------+---------+--------+--------+--------+----
D | +0 | +1 | +2 | +3 | +4 | +5 | +6 | ...
+--------+----+-+-+--------+----+----+--------+-+-+----+--------+----
B | 0..7 |0..5|6|7| 0..7 |0..3|4..7| 0..7 |0|1|2..7| 0..7 | ...
+--------+----+-+-+--------+----+----+--------+-+-+----+--------+----
E | [0] | [1] | [2] | [3] | ...
+-------------+-----------------+-----------------+-------------+----
D: バイト列のデータ
B: バイト内のビット位置
E: 符号化に使用する 14 ビット区切り。これに 0x4E10 を加えた文字を使用する。
制御文字: U+4E03 〜 U+4E0F
符号化したデータは14ビット単位の情報なので、元のバイト列が7の倍数でないとき、最後の情報文字(U+4E10〜U+8E0F
)では有効な情報が一部になります。
このとき、0x4E10
から有効なビット数(1〜13
)を引いた U+4E03 〜 U+4E0F
を制御文字として追加します。
見た目は小さくなるが…
バイナリをテキストに変換する例として Base 64 と比較してみます。
Base 64 | Kanji14 | |
---|---|---|
21 バイト → 文字数 | 28 | 12 (半角24) |
21 バイト → UTF-16 | 56 バイト | 24 バイト |
21 バイト → UTF-8 | 28 バイト | 36 バイト |
シフトJIS 変換 | 影響なし | 不可 |
Kanji14 は表示すると短くなったように見えますが Base 64 の方が実用的です。
プログラム