UTF-16
テンプレート:複数の問題 テンプレート:Table Unicode UTF-16 (UCS/Unicode Transformation Format 16) は、Unicode及びISO/IEC 10646の符号化形式及び符号化スキーム(文字符号化方式を参照)のひとつである。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つの16ビットで表される(ビッグエンディアンならISO/IEC 10646のUCS-2と互換である)。BMP以外の文字は、符号単位2つの32ビットで表される。なお、UTF-16は2バイトコードだと誤解されることがあるが、このように4バイトのこともあるため間違いである。
Unicodeにおいては、厳密には、文字符号化形式(テンプレート:Lang-en-short)の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化スキーム(テンプレート:Lang-en-short)の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+10000..U+10FFFFは、表のようにビットを配分して、符号単位2つで表す。
このとき使われる、U+D800 ~ U+DFFF の符号位置を、代用符号位置(Surrogate Code Point)と呼び、BMP外の1つの符号位置を表す連続した2つの代用符号位置のペアをサロゲートペアと呼ぶ。代用符号位置に使うため、BMPのこの領域には文字が収録されておらず、UTF-16以外の符号化スキームでは通常は使用されない。
Unicodeの符号位置の最大がU+10FFFFなのは、それがUTF-16で表せる最大だからである。また、ISO/IEC 10646でも、U+110000以降は、文字が割り当てられることは無いということに、現在はされている。
スカラ値 | UTF-16 | 備考 |
---|---|---|
xxxxxxxxxxxxxxxx | xxxxxxxxxxxxxxxx | |
000uuuuuxxxxxxxxxxxxxxxx | 110110wwwwxxxxxx 110111xxxxxxxxxx | wwww = uuuuu - 1 |
UTF-16符号化形式は、Java(J2SE 5.0以上)において文字の内部表現であるchar型(16ビット符号なし整数型)として、またWindows XPなどのOSにおけるプログラムではワイド文字として実装される。
符号化スキーム
UTF-16符号化形式で表現された文字は、16ビット符号なし整数の符号単位列でありプログラム内部での処理には都合がよいが、情報交換のためにファイルの読み書きや通信を行う場合は、適当な符号化スキームによりバイト直列化する必要がある。
UTF-16の場合、バイト順序などの違いにより、この方法には3種類ある。なお、符号化スキームによって符号単位の中でのバイト順序は異なるが、符号単位の順序は変わらないことに注意。
UTF-16BE符号化スキーム
16ビット整数をビッグエンディアンで直列化する。バイト順マーク (BOM) は使用不可。
UTF-16LE符号化スキーム
16ビット整数をリトルエンディアンで直列化する。バイト順マーク (BOM) は使用不可。
UTF-16符号化スキーム
バイト順序はリトルエンディアンでもビッグエンディアンでもよい。
あるデータが UTF-16 符号化スキームで符号化されているとわかっていても、これだけではバイト順序が決まらないので、解釈できない。そのため、バイト順マーク (BOM) を使うことができる。
BOM は U+FEFF に割り当てられた特殊文字で、データストリームの最初に置く(テキストの最初の文字のさらに前にBOMが来る)。もし、デコーダーとエンコーダーのバイト順アーキテクチャが同一であれば、デコーダーは U+FEFF という BOM の値を検出するはずであるが、そうでなければ U+FFFE という値になる。この目的のため、BOM のバイト順序を逆にした U+FFFE は予約されており、使用してはならない。
BOM は使わなくてもいいが、そのときは、ビッグエンディアンにするように決められている(ただしこれはUTF-16符号化スキームでの話であり、UTF-16LEはもちろんBOMなしでリトルエンディアンである)。
つまり、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 00 4D | FE FF D8 00 DF 02 |
FF FE 4D 00 | FF FE 00 D8 02 DF | |
00 4D | D8 00 DF 02 |
普及
UTF-16符号化形式は、Windows XPなど多くのOSで、内部表現に使われている。
Windowsでは、リトルエンディアンのUTF-16符号化スキームが使われている。内部表現では16ビット符号なし整数を符号単位とするUTF-16符号化形式(CEFなのでBOMはなし)として扱い、ファイルなどではBOMありのUTF-16符号化スキーム(リトルエンディアン)が主である。
TCP/IPネットワークでは、プロトコルヘッダやMIME等の手段で文字符号化スキームを指定しない場合はビッグエンディアンに決められている。
参考資料
用語の日本語表記は原則として次にならった。テンプレート:Cite web