UTF-16
出典: フリー百科事典『ウィキペディア(Wikipedia)』
UTF-16 (UCS/Unicode Transformation Format 16) は、Unicodeの文字符号化体系であるUTFの1つ。UTFは、UnicodeではUnicode Transformation Format、ISO/IEC 10646ではUCS Transformation Formatの略とされる。ISO/IEC 10646での正式名称はUCS Transformation Format for 16 Planes of Group 00。Unicodeでは、UTF-16が正式名称である。
UTF-16では、1文字が、16ビットの符号単位1つまたは2つで符号化される。これが「-16」の名の由来である。特に、BMP内の文字は、符号単位1つで表され、(ビッグエンディアンなら)UCS-2と互換である。このため、UTF-16は2バイトコードだと誤解されることがあるが、間違いである(この説明はUCS-2に対しては正しい)。
Unicodeにおいては、厳密には、文字符号化形式の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化体系の1つの名称でもある。UTF-16符号化形式のための文字符号化体系には、UTF-16の他にUTF-16BE、UTF-16LEがある。
目次 |
[編集] UTF-16符号化形式
UTF-16では、Unicodeスカラ値U+0000..U+10FFFFを、16ビット符号なし整数を符号単位とした符号単位列で表す。符号単位列は1つまたは2つの符号単位からなる。つまり、合計は16ビットまたは32ビットである。
BMPに含まれるU+0000..U+D7FFとU+E000..U+FFFFは、そのまま符号単位1つで表す。
BMP以外のU+100000..U+10FFFFは、表のようにビットを配分して、符号単位2つで表す。
このとき使われる、D80016..DFFF16の符号単位(Unicodeスカラ値では無いので、U+xxxxとは書かない)を、サロゲートと呼び、1つのUnicodeを表す連続した2つのサロゲートをサロゲート・ペアと呼ぶ。サロゲートに使うため、BMPのこの領域には文字が収録されておらず、UTF-16以外の符号化体系では使用されない。
ちなみに、Unicodeスカラ値の最大がU+10FFFFなのは、これがUTF-16で表せる最大のスカラ値だからである。また、ISO/IEC 10646でも、11000016以上は予約領域または私用領域となっており、文字が割り当てられることは無い。
スカラ値 | UTF-16 | 備考 |
---|---|---|
xxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxx | |
000uuuuuxxxxxxxxxxxxxxxx | 110110wwwwxxxxxx 110111xxxxxxxxxx | wwww = uuuuu - 1 |
[編集] 符号化体系
UTF-16符号化形式の結果はまだ抽象的な数列である符号単位列にすぎず、符号化体系として完結するには、これをバイト列にシリアライズする必要がある。
エンディアン(バイト順序)の違いにより、この方法には3種類かある。なお、符号化体系によって符号単位の中でのバイト順序は異なるが、符号単位の順序は変わらないことに注意。
[編集] UTF-16BE符号化体系
16ビット整数をビッグエンディアンでシリアライズする。
[編集] UTF-16LE符号化体系
16ビット整数をリトルエンディアンでシリアライズする。
[編集] UTF-16符号化体系
エンディアンはリトルエンディアンでもビッグエンディアンでもいい。
あるデータがUTF-16符号化体系で符号化されているとわかっていても、これだけではエンディアンが決まらないので、復号できない。そのため、バイト順序マーク (BOM) を使うことができる。
BOMはU+FEFFに割り当てられた特殊文字で、データの最初に置く(テキストの最初の文字のさらに前にBOMが来る)。いっぽう、BOMのバイト順序を逆にしたU+FFFEは予約である(使用してはならない)。このため、もしエンディアンを間違えていれば、予約のはずのU+FFFEでデータが始まることとなり、間違えていたことがわかる。
BOMは使わなくてもいいが、そのときは、ビッグエンディアンにするように決められている。(ただし、Windows上の文書における「Unicodeテキスト」は特に明記のない場合につき、リトルエンディアンのことを指す。[→ Unicode]。また、TCP/IPネットワークでは、ビッグエンディアンに決められている[→ エンディアン]。)
つまり、UTF-16符号化体系のデータは、同じ内容に対し、以下の3種類が許される。
- BOMで始まりビッグエンディアン
- BOMで始まりリトルエンディアン
- BOMで始まらずビッグエンディアン
3つ目は、UTF-16BEと同じバイト列である。
文字 | M | 𐌂 |
---|---|---|
スカラ値 | U+004D | U+10302 |
符号単位列 | 004D | D800 DF02 |
UTF-16BE | 00 4D | D8 00 DF 02 |
UTF-16LE | 4D 00 | 00 D8 02 DF |
UTF-16 | FE FF 4D 00 | FE FF D8 00 DF 02 |
FF FE 4D 00 | FF FE 00 D8 02 DF | |
00 4D | D8 00 DF 02 |
[編集] 普及
UTF-16は、WindowsXPなど多くのOSで、内部表現に使われている。
[編集] 他の主なUTF
- UTF-8
- UTF-32