UTF-16
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Unicode |
---|
符号化方式 |
UCS |
マッピング |
書字方向 |
BOM |
漢字統合 |
UnicodeとHTML |
Unicodeと電子メール |
Unicodeフォント |
UTF-16 (UCS/Unicode Transformation Format 16) は、Unicodeの文字符号化方式 (encoding scheme) である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においては、厳密には、文字符号化形式 (encoding form) の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+10000..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符号化形式は、Java(J2SE 5.0以上)において文字の内部表現であるchar型(16ビット符号なし整数型)として、またWindowsXPなどのOSにおけるプログラムではワイド文字として実装される。
[編集] 符号化方式
UTF-16符号化形式で表現された文字は、16ビット符号なし整数の符号単位列でありプログラム内部での処理には都合がよいが、情報交換のためにファイルの読み書きや通信を行う場合は、適当な符号化方式によりバイト列に直列化する必要がある。
UTF-16の場合、エンディアン(バイト順序)などの違いにより、この方法には3種類かある。なお、符号化方式によって符号単位の中でのバイト順序は異なるが、符号単位の順序は変わらないことに注意。
[編集] UTF-16BE符号化方式
16ビット整数をビッグエンディアンで直列化する。バイト順序マーク (BOM) は使用不可。
[編集] UTF-16LE符号化方式
16ビット整数をリトルエンディアンで直列化する。バイト順序マーク (BOM) は使用不可。
[編集] UTF-16符号化方式
バイト順序はリトルエンディアンでもビッグエンディアンでもよい。
あるデータがUTF-16符号化方式で符号化されているとわかっていても、これだけではエンディアンが決まらないので、解釈できない。そのため、バイト順序マーク (BOM) を使うことができる。
BOMはU+FEFFに割り当てられた特殊文字で、データストリームの最初に置く(テキストの最初の文字のさらに前にBOMが来る)。いっぽう、BOMのバイト順序を逆にしたU+FFFEは予約である(使用してはならない)。このため、もしバイト順序を間違えていれば、予約のはずの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符号化形式は、WindowsXPなど多くのOSで、内部表現に使われている。
Microsoft Windowsでは、リトルエンディアンのUTF-16符号化方式が使われている。内部表現では16ビット符号なし整数を符号単位するUTF-16符号化形式(CEFなのでBOMはなし)として扱い、ファイルなどではBOMありのUTF-16符号化方式(リトルエンディアン)が主である。
TCP/IPネットワークでは、プロトコルヘッダやMIME等の手段で文字符号化方式を指定しない場合はビッグエンディアンに決められている。