Unicode/UTF-8/UTF-16/UTF-32の違い


このエントリーをはてなブックマークに追加

Python3を勉強している間に読んだ記事

文字列 - Dive Into Python 3 日本語版

中のUnicode/UTF-*の説明がとてもわかりやすかった。以下はそれを自分用に乱暴にまとめたもの。

 

Unicode

  • すべての言語のすべての文字を表現するために設計されたシステム
  • すべての文字や記号を4バイトの数値で表現

UTF-{32,16,8}

UTF-32

  • Unicode文字(4バイトの数値)を受け取って、それと同じ数値でその文字を表現
  • つまり、4バイトの固定長
  • エンディアンの問題あり

UTF-16

  • ほとんどの文字を2バイトで表現
  • めったに使われない文字を4バイトで表現
  • エンディアンの問題あり

UTF-8

  • ASCII文字を1バイトで表現
  • 拡張ラテン文字を2バイトで表現
  • 中国語(※日本語も)の文字を3バイトで表現
  • めったに使われない文字を4バイトで表現
  • エンディアンの問題なし

 

補足

UTF-8だとエンディアンの問題がないのでバラ色かというと結局そうとも言い切れない。エンディアンの種類を明示的に表すために付与する バイトオーダーマーク - Wikipedia がその原因。UTF-8ではエンディアンの問題がないのでBOMは本来不要なはずだが、ソフトによってBOM付きのUTF-8しか受け付けない場合やその逆の場合があり、我々を混乱させてくれる(参考:UTF-8 - Wikipedia)。