Unicode, UTF についてひっかかったので色々メモ


もう文字コードおなかいっぱいなのですが...

Unicode と UTF の違い

  • Unicode : 符号化文字集合
  • UTF : 符号化方式

符号化文字集合と、符号化方式についてはこちらを参照 -> 本当は怖くないCP932

Unicode

  • 文字セットの切り替えなしに、世界中の文字を単一文字集合として扱う符号化文字集合規格
  • 21ビットの範囲(0x00000〜0x10FFFF)
  • 各文字の位置は先頭に U+ をつけて表す( Unicodeコードポイント と呼ぶ)
    • 例えば 🗿 ならば U+1F5FF

UTF-8, UTF-16, UTF-32 の違い

UTF-32

  • Unicodeコードポイントをそのままつかった符号化方式
  • 21ビットだと切りが悪いので、32ビット

UTF-16

  • 1文字16ビット
  • 元々、unicodeは16ビットの固定長として開発されたため 、最初はUTF-16が、unicodeの唯一の符号化方式だった
  • 16ビット以上の文字については、 サロゲートペア という仕組みで16ビットx2で表現

サロゲートペア

  • Unicode1.0では、16ビット固定で、2^16(=65,536)個に全ての文字を入れる計画だった
    • U+0000〜U+FFFF
    • 漢字圏のこと考えてねぇ...
  • 漢字入りきらねぇよ! ってなって、Unicode3.0で拡張された
    • U+0000〜U+10FFFF
  • で、元々全て16ビットの範囲内に入ると思って作られたUTF-16だと入りきらない! となって、対応方法が検討された

サロゲートペアの方法

  • U+D800〜U+DFFF までには文字を割り当てない
    • これらを サロゲートコードポイント と呼ぶ
  • U+D800〜U+DBFF を 上位サロゲート と呼ぶ
  • U+DC00〜U+DFFF を 下位サロゲート と呼ぶ
  • UTF-16では、上位サロゲートと下位サロゲートの組み合わせで、U+10000以降の文字を表現している
  • UTF-16専用の仕様であるが、これらの為にUnicodeがサロゲートコードポイントを策定しているので、他のUTFも影響を受けた
    • サロゲートコードポイントには、当然どのUTFでも文字は宛てられていない

UTF-8

  • UTF-16の内、1バイトで表せる文字(ASCII)については、1バイトで表す( ASCIIの上位互換 )
  • 残りについては、範囲に応じて 2バイト〜4バイト にエンコードする
    • エンコード方法についてはこちらを参照 -> UTF-8
  • 必要に応じて文字のバイト数が変動するので、容量の無駄が少ないのが特徴

UTF-8 mb4

  • 4バイト対応のUTF-8のこと
  • Unicode2系までは、UTF-8は最大3バイトだったので、3バイトまでしか対応していないUTF-8実装があった
  • 例えばMySQLは、5.5.33までは4バイト対応しておらず、後から追加された絵文字や追加漢字(𠮷とか)は格納できなかった

絵文字についてメモ

  • 絵文字が追加されたのは、2010年の Unicode 6.0から
  • 以下のバージョン以降のOSは標準で対応している
    • windows : 8以降
    • MacOS : 10.7(Lion)以降
    • それ以前のバージョンでも絵文字対応しているフォントを落とせば見れるらしい
    • 参考 : Help:特殊文字 - Wikipedia

その他色々

  • Microsoft Windows や Javaでは "Unicode" といえば UTF-16 のリトルエンディアン という暗黙の了解になっている。
    • 元々Unicodeが16ビット固定長で開発されたという歴史的経緯のため

参考

サロゲートペア関係