UTF-16

出典: フリー百科事典『ウィキペディア(Wikipedia)』

出典: フリー百科事典『ウィキペディア(Wikipedia)』

UTF-16 (UCS/Unicode Transformation Format 16[注釈 1]) とは、UnicodeおよびISO/IEC 10646の、符号化フォームおよび符号化スキーム(文字符号化方式を参照)のひとつである。

UTF-16では、1文字が、16ビットの符号単位が1つまたは2つで符号化される。これが「-16」の名の由来である。基本多言語面(BMP)内の文字は、符号単位1つの16ビットで表される。BMP以外の文字は、符号単位2つの32ビットで表される。なお、UTF-16は2バイトコードだと誤解されることがあるが、このように4バイトのこともあるため間違いである。

Unicodeにおいては、厳密には、文字符号化フォーム(: Character Encoding Form)の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化スキーム(: Character Encoding Scheme)の1つの名称でもある。UTF-16符号化フォームのための文字符号化スキームには、UTF-16の他にUTF-16BEUTF-16LEがある。

符号化[編集]

UTF-16では、Unicodeの代用符号位置を除いた符号位置(Unicodeスカラ値という)を、16ビット符号なし整数を符号単位とした符号単位列で表す。符号単位列は1つまたは2つの符号単位からなる。つまり、合計は16ビットまたは32ビットである。

BMPに含まれるU+0000..U+D7FFとU+E000..U+FFFFは、そのまま符号単位1つで表す。

BMP以外のU+10000..U+10FFFFは、表のようにビットを配分して、符号単位2つで表す。

スカラ値 UTF-16 備考
xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxx  
000uuuuuxxxxxxxxxxxxxxxx 110110wwwwxxxxxx 110111xxxxxxxxxx wwww = uuuuu - 1

このとき使われる、U+D800 ~ U+DFFF の符号位置を、代用符号位置(Surrogate Code Point)と呼び、BMP外の1つの符号位置を表す連続した2つの代用符号位置のペアをサロゲートペアと呼ぶ。代用符号位置に使うため、BMPのこの領域には文字が収録されておらず、UTF-16以外のUTF-8UTF-32では使用されない。

Unicodeの符号位置の最大がU+10FFFFなのは、それがUTF-16で表せる最大だからである。

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

符号化スキームにはUTF-16、UTF-16BE、UTF-16LEの3種類ある。UTF-16BEは16ビット整数をビッグエンディアンで直列化する。UTF-16LEはリトルエンディアンで直列化する。UTF-16BE、UTF-16LEの場合はバイト順マーク (BOM) の付与は許されない。UTF-16の場合はBOMでエンディアンを明示するか、上層のプロトコルで指定されておらずBOMも付与しない場合はビッグエンディアンにするよう決められている[1]

比較[編集]

UTF-8UTF-32と比較して、一般的な日本語が主体の文章ではUnicode符号化方式の中では最小サイズとなる。追加面の文字が含まれる場合、バイト順にソートしても符号位置順とはならない。また、UTF-8と違いASCII互換ではない。

Shift_JISと比較して、Shift_JISでは1バイト文字と、2バイト文字の1バイト目と2バイト目の値範囲が一部重複しているが、UTF-16では1符号単位文字、サロゲートペアの前半の符号単位、後半の符号単位がすべて異なる値範囲を取る。そのためShift_JISであった、例えば「a」で検索すると2バイト目にマッチする場合がある、途中から読みこむと文字の区切りがわからないときがある、1バイト目や2バイト目が欠落した場合、後続の文字すべてが文字化けする可能性がある、などの問題は発生しない。UTF-16では欠落があっても影響を受けるのはその文字だけである[2]

利用[編集]

UTF-16符号化フォームは、WindowsJavaJ2SE 5.0以上)で、内部表現に使われている。Windowsの内部表現では16ビット符号なし整数を符号単位とするUTF-16符号化フォームとして扱い、ファイルなどではBOMありのUTF-16符号化スキーム(リトルエンディアン)が主である。

TCP/IPネットワークでは、プロトコルヘッダやMIME等の手段で文字符号化スキームを指定しない場合はビッグエンディアンに決められている。

脚注[編集]

注釈[編集]

  1. ^ UTFは、UnicodeではUnicode Transformation Formatの略、ISO/IEC 10646ではUCS Transformation Formatの略とされる。

出典[編集]

  1. ^ The Unicode Standard Version 12.0 (PDF)” (English). The Unicode Consortium. p. 131 (2019年3月). 2019年5月12日閲覧。 “The UTF-16 encoding scheme may or may not begin with a BOM. However,when there is no BOM, and in the absence of a higher-level protocol, the byteorder of the UTF-16 encoding scheme is big-endian.”
  2. ^ FAQ - UTF-8, UTF-16, UTF-32 & BOM” (English). The Unicode Consortium (2017年6月27日). 2019年5月12日閲覧。

参考資料[編集]

用語の日本語表記は次を参考にした。Unicode Terminology English - Japanese”. Unicode, Inc. 2010年1月1日閲覧。

関連項目[編集]