Unicode
Unicode文字集合や、後述のエンコード方式、正規化方式…諸々を定めたもの。
ただし、Windowsにおいて、“Unicode”がUTF-16 Little Endianのこととして使われたため、エンコード方式としばしば混同される。
UTF-8
最もよく使われる符号化方式。
1つのスカラー値あたり1 - 4バイトの可変長である。
CESU-8
一部のDBでは、BMP外の文字をサロゲートペアを残したままUTF-8に変換する方式として、CESU-8が定義されている。
上位サロゲートと下位サロゲートをそれぞれ3バイト・3バイトにエンコードする。
Javaのclassファイルでは、上記に加え、U+0000は0x00ではなく、0xA0 0x80にエンコードされる。
UTF-8では、このような表現は不正なシーケンスとみなされる。
UTF-16
WindowsやMacOS、Java、.NETなどの内部表現として使われている。
BMPの文字は、1コードポイントあたり16bitで表現するため、エンディアンの違いによる影響を受ける。
BMP外の文字は、サロゲートペアを使い、32bitで表現するため、固定長ではない。
UTF-32
1つのスカラー値を常に32bit使って表現する。
上位11bitは常に0のため空間効率は悪いが、コードポイントへの変換効率はよい。
Linuxではwchar_tの内部表現とする場合が多い。
BOM (Byte Order Mark)
UTF-16, UTF-32では、バイトオーダーによって表現が異なるため、ファイルの最初にバイトオーダーを示すためにBOMが挿入されることがある。
BOMには、U+FEFF (ZERO WIDTH NO-BREAK SPACE) が使用される。
また、UTF-8にもBOMと称して、0xEF 0xBB 0xBFの3バイトが挿入される場合がある。
UTF-8はバイトオーダーは関係ないので、BOMを挿入する必要はなく、また挿入すべきではない。
Windowsのメモ帳、ワードパッド、一部のテキストエディタがBOMを挿入するので注意が必要。
コードポイント
エンコード可能な数値の範囲。U+0000 - U+10FFFFの範囲にあたる。
スカラー値
コードポイントからサロゲートペアに使われる範囲を除いたもの。
U+0000 - U+D7FFと、U+E000 - U+10FFFFの範囲にあたる。