UTF-16

Article on other languages:

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

Unicodeにおいては、厳密には、文字符号化形式 (encoding form) の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化方式の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とは書かない)を、サロゲートと呼び、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符号化形式は、JavaJ2SE 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種類が許される。

  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等の手段で文字符号化方式を指定しない場合はビッグエンディアンに決められている。

他の主なUTF

This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.


Giant Panda

Mercedes Car
James Bond Guide
This site monitored by SitePinger.net