UTF-16とは
UTF-16は、
Unicodeおよび
ISO/IEC 10646|ISO_IEC 10646で定義される
文字符号化方式の一つです。この方式では、1
文字を
16ビットの符号単位1つ、または2つで表現します。そのため、名称に「-16」が含まれています。基本多言語面(BMP)に属する
文字は1つの
16ビットで表されますが、BMP外の
文字は2つの
16ビット、つまり
32ビットで表現されます。
よく誤解される点として、UTF-16は常に2バイトの符号化方式であるという認識がありますが、実際には4バイトで表現されるケースも存在します。
UTF-16の構造
UnicodeにおけるUTF-16は、
文字符号化フォームおよび
文字符号化スキームという二つの側面を持っています。UTF-16符号化形式のための
文字符号化スキームとしては、UTF-16の他に、UTF-16BE(ビッグエンディアン)、UTF-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つの符号単位で表現されます。この際、U+D800からU+DFFFの範囲の符号位置が「代用符号位置(サロゲートコードポイント)」として使用されます。
- - 2つの代用符号位置で表されるペアを「サロゲートペア」と呼びます。この代用符号位置は、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によってエンディアンを指定するか、上位プロトコルで指定がない場合はビッグエンディアンとすることが定められています。
他の符号化方式との比較
UTF-8やUTF-32と比較すると、一般的な日本語の文章ではUTF-16が最も小さいサイズになることが多いです。ただし、追加面の
文字が含まれる場合は、バイト順でソートしても符号位置順とはなりません。また、UTF-16は
ASCII互換ではありません。
Shift_JISとの比較では、Shift_JISは1バイト
文字と2バイト
文字の値範囲が重複しているため、検索や
文字の区切りで問題が発生しやすいです。一方、UTF-16では、1符号単位
文字、サロゲートペアの前半、後半の符号単位がそれぞれ異なる値範囲を持つため、このような問題は発生しません。UTF-16では、一部のデータが欠落した場合でも、影響を受けるのはその
文字のみです。
利用例
UTF-16は、Windowsや
Java(J2SE 5.0以上)で内部表現として利用されています。Windowsでは、
16ビット符号なし整数を符号単位とするUTF-16符号化形式を使用し、ファイルなどではBOM付き(リトルエンディアン)のUTF-16符号化スキームが主に用いられます。
TCP/IPネットワークでは、プロトコルヘッダやMIMEなどで
文字符号化スキームが指定されていない場合は、ビッグエンディアンが採用されます。
まとめ
UTF-16は、
Unicodeを効率的に表現するための重要な符号化方式であり、特にWindowsや
Javaの環境で広く利用されています。その構造や他の符号化方式との違いを理解することで、
文字コードに関する問題を適切に処理できるようになります。
参考資料
関連項目