UTF-16

UTF-16 (UCS/Unicode Transformation Format 16) とは、UnicodeおよびISO/IEC 10646の、符号化フォームおよび符号化スキーム（文字符号化方式を参照）のひとつである。
UTF-16では、1文字が、16ビットの符号単位が1つまたは2つで符号化される。これが「-16」の名の由来である。基本多言語面（BMP）内の文字は、符号単位1つの16ビットで表される。BMP以外の文字は、符号単位2つの32ビットで表される。なお、UTF-16は2バイトコードだと誤解されることがあるが、このように4バイトのこともあるため間違いである。
Unicodeにおいては、厳密には、文字符号化フォーム（）の1つの名称であり、かつ、UTF-16符号化形式のための文字符号化スキーム（）の1つの名称でもある。UTF-16符号化フォームのための文字符号化スキームには、UTF-16の他にUTF-16BE、UTF-16LEがある。
符号化.
UTF-16では、Unicodeの代用符号位置を除いた符号位置（Unicodeスカラ値という）を、16ビット符号なし整数を符号単位とした符号単位列で表す。符号単位列は1つまたは2つの符号単位からなる。すなわち、合計は16ビットまたは32ビットである。
BMPに含まれるcodice_1–codice_2とcodice_3–codice_4は、そのまま符号単位1つで表す。BMP以外のcodice_5–codice_6は、表のようにビットを配分して、符号単位2つで表す。
このとき使われる、codice_7–codice_8 の符号位置を、代用符号位置（Surrogate Code Point）と呼び、BMP外の1つの符号位置を表す連続した2つの代用符号位置のペアをサロゲートペアと呼ぶ。代用符号位置に使うため、BMPのこの領域には文字が収録されておらず、UTF-16以外のUTF-8、UTF-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も付与しない場合はビッグエンディアンにするよう決められている。
比較.
UTF-8、UTF-32と比較して、一般的な日本語が主体の文章ではUnicode符号化方式の中では最小サイズとなる。追加面の文字が含まれる場合、バイト順にソートしても符号位置順とはならない。また、UTF-8と違いASCII互換ではない。
Shift_JISと比較して、Shift_JISでは1バイト文字と、2バイト文字の1バイト目と2バイト目の値範囲が一部重複しているが、UTF-16では1符号単位文字、サロゲートペアの前半の符号単位、後半の符号単位がすべて異なる値範囲を取る。そのため、Shift_JISであった、例えば「a」で検索すると2バイト目にマッチする場合がある、途中から読みこむと文字の区切りがわからないときがある、1バイト目や2バイト目が欠落した場合、後続の文字すべてが文字化けする可能性がある、などの問題は発生しない。UTF-16では欠落があっても影響を受けるのはその文字だけである。
利用.
UTF-16符号化フォームは、Windows や Java（J2SE 5.0以上）で、内部表現に使われている。Windowsの内部表現では、16ビット符号なし整数を符号単位とするUTF-16符号化フォームとして扱い、ファイルなどでは、BOMあり（リトルエンディアン）のUTF-16符号化スキームが主である。
TCP/IPネットワークでは、プロトコルヘッダやMIME等の手段で文字符号化スキームを指定しない場合は、ビッグエンディアンに決められている。
参考資料.
用語の日本語表記は次を参考にした。