鳩丸ぐろっさり (用語集)

bakera.jp > 鳩丸ぐろっさり (用語集) > UTF-16

用語「UTF-16」について

UTF-16 (ゆーてぃーえふじゅうろく)

ISO10646 (Unicode, UCS-4 と等価) の文字を表現するための文字符号化方式のひとつです。RFC2781 で定義されています。一つの文字を表現するのに 16 ビットを使うのでこの名があります。

UTF-16 では、原則として一つの文字を 16 ビットで表現します。しかし、16 ビットでは BMP の文字しか表現できませんので、それ以外の文字はサロゲートの組み合わせ (サロゲートペア) によって表現します。しかしサロゲートペアを使って表現できるのも 0x10000 から 0x10FFFF までに限られていて、それ以降の文字は UTF-16 では表現することができません。

※もっとも、いまのところは UTF-16 で表現できないような文字は定義されていませんし、多くの場合はサロゲートすら使わずに用が済んでしまうでしょう。

HTML 4.01 の SGML宣言には以下のような部分があります。

DESCSET
(略)
55296 2048 UNUSED -- SURROGATES --
57344 1056768 57344

この最後の 2行は明確に UTF-16 を意識していて、サロゲートは単独では使用できないこと、HTML で使用できる文字の範囲は UTF-16 で表現できる範囲であることが宣言されています。もっとも、最大範囲については制限する意図があるわけではないと書かれていますが……。(It does not imply any statement about the feasibility of a long-term restriction of characters in UCS to the first 17 planes. )

なお、16ビットというのは 2オクテットなわけで、UTF-16 にはエンディアンの問題があります。数字 2文字からなる文字列「16」は 0x0031 0x0036 ですが、これを 1オクテットずつ区切ると 0x00 0x31 0x00 0x36 と分かれます。これをそのまま 0x00 0x31 0x00 0x36 の順にするのがビッグエンディアン、上位と下位を入れ替えて 0x31 0x00 0x36 0x00 の順にするのがリトルエンディアンです。このエンディアンの違いを明確にするために、BOM という記号が用意されています。UTF-16 で符号化された文書の先頭にはたいてい BOM がついています。

そんな UTF-16 ですが、UTF-8 と異なり、US-ASCII と互換性がありません。ASCII文字も 2オクテットで表現しますので、ASCII文字だけの文書ならば UTF-8 の 2倍のデータ量となります (BOM がついていればさらに +2オクテット)。逆に、日本語の文字なども 16ビットで表現しますので、日本語の文字だけの文書ならば UTF-8 の 2/3 のデータ量で済みます。

最近の日記

関わった本など