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つの16ビットで表される(ビッグエンディアンならISO/IEC 10646のUCS-2互換である)。BMP以外の文字は、符号単位2つの32ビットで表される。なお、UTF-16は2バイトコードだと誤解されることがあるが、このように4バイトのこともあるため間違いである。

Unicodeにおいては、厳密には、文字符号化形式[1]: Character Encoding Form)の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化スキーム[1]: Character Encoding Scheme)の1つの名称でもある。UTF-16符号化形式のための文字符号化スキームには、UTF-16の他にUTF-16BEUTF-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とは書かない)を、代用符号位置[2]と呼び、1つのUnicodeを表す連続した2つの代用符号位置をサロゲートペア(代用対)[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符号化形式は、JavaJ2SE 5.0以上)において文字の内部表現であるchar型(16ビット符号なし整数型)として、またWindowsXPなどのOSにおけるプログラムではワイド文字として実装される。

[編集] 符号化スキーム

UTF-16符号化形式で表現された文字は、16ビット符号なし整数の符号単位列でありプログラム内部での処理には都合がよいが、情報交換のためにファイルの読み書きや通信を行う場合は、適当な符号化スキームによりバイト直列化[3]する必要がある。

UTF-16の場合、バイト順序などの違いにより、この方法には3種類かある。なお、符号化スキームによって符号単位の中でのバイト順序は異なるが、符号単位の順序は変わらないことに注意。

[編集] UTF-16BE符号化スキーム

16ビット整数をビッグエンディアンで直列化する。バイト順マーク[3] (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種類が許される。

  1. BOMで始まりビッグエンディアン
  2. BOMで始まりリトルエンディアン
  3. 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等の手段で文字符号化スキームを指定しない場合はビッグエンディアンに決められている。

[編集] 脚注

  1. ^ a b Unicode Terminology English - Japanese, C, Unicode, Inc.
  2. ^ a b Unicode Terminology English - Japanese, S, Unicode, Inc.
  3. ^ a b Unicode Terminology English - Japanese, B, Unicode, Inc.

[編集] 関連項目