プログラマのための文字コード技術入門 第4章「代表的な文字符号化方式」その2

今日は第4章の Unicode文字符号化方式です。

  • Unicode の符号化方式
  • 元はシンプルに区点番号を並べた UCS-2, UCS-4
  • UTF-16
    • 1つの符号位置は基本2バイト。BMP面以外は 4バイト
    • BMP はシンプルに16ビットで符号化できる。他の面はサロゲートペアを用いる
    • サロゲートペア - BMP 内の文字割り当てのない符号位置を2つ使って1つの符号位置を表す
    • ビックエンディアン、リトルエンディアンの違いがある(どっちも使えてしまう)
    • BOM (Byte Order Mark U+FEFF) はバイトオーダーを指定するものでデータ先頭に付く。途中を切り出す時に面倒そう
    • シンプルなのでプログラミング言語の内部処理などに向いてる
  • UTF-32
    • 1つの符号位置は4バイト固定
    • サロゲートペアは必要ない。よって換算も必要ない
    • UCS-4 のうち、群00の面00から10までの符号位置のみを許している(UTF-32 は UCS-4 のサブセット)
    • BOM あり(U+FEFF)
    • もっとシンプルなので内部処理に向いているけど記憶容量的には無駄が多い
  • UTF-8
    • 1つの符号位置は1バイトから6バイト(現実的には4バイト)で表現される
    • ASCII 互換(ASCII の範囲(7ビット)の文字は1バイトで表現される)
    • 先頭の1バイトの上位ビットをみて何バイトで表現されているかわかる。符号位置に応じて異なるビット位置で分割して埋め込まれる
    • それだけでなくどのバイト位置も上位ビットをみると文字の途中なのか先頭なのかわかるので文字の区切りを判別できる。賢い!
    • UTF-8 には同じ符号位置を異なるバイト数で符号する(上位の0を無視しない)ことができてしまうので、文字種チェックなどをすりぬけてセキュリティ上の問題になることがある。現在は可能な限り短い符号化をしないといけないことになっている
    • CESU-8 と Modified UTF-8 なんかこういうのもある

ついに UTF-8 の符号化を学びました。BOM とかサロゲートペアといった「聞いたことがあるんだけど実は何なのかよく知らない」言葉の意味がわかってとてもすっきりしました。