UTF-16
読み:ユーティーエフ-じゅうろく
外語:UTF-16: UCS Transformation Format-16

 UnicodeISO/IEC 10646の符号化方法(CES)の一つ。サロゲートペアという方法で、16ビットの範囲を超える文字を扱えるようにした。RFC 2781で情報提供扱いで規定されている。
目次

起源
 Unicode 3.0以降で採用された符号化方法である。
 Unicodeは元々は「16ビット固定長」の文字集合であり、ISO/IEC 10646用語では基本多言語面(BMP)と表現される集合である。従って扱える文字数は216で最大65,536文字に限られた。
 そこでこのUnicodeの中で未定義だった領域に、サロゲートと呼ばれる1024個の領域を二つ(0xd800〜0xdb00と0xdc00〜0xdf00)用意し、これを組み合わせ1,024×1,024=1,048,576個の文字を扱えるようにした。
 この文字数は、BMPの大きさである65,536(216)の16倍に相当する。

特徴

構成
 Unicodeには、U+0000からU+10FFFFまでのコードポイントが存在する。
 元々16ビット固定長として作られたUnicodeであったが、16ビットを超える範囲を符号化するために、16ビットを二つ組み合わせて、16ビットを超える範囲の文字を表現することになった。この専用の記号文字をサロゲートといい、二つ組み合わせる手法をサロゲートペアという。
 UTF-16では1バイトが16ビットになるが、これをバイトと呼ぶと混乱を招くため、UTF-16ではこれをコードユニットと呼ぶ。このように、16ビットのコードユニットを組み合わせてUnicodeを表現する符号化方法を、UTF-16という。

CESとCEF
 UTF-16は16ビット単位で文字が表現されるが、コンピューターではそれを8ビットごとに分解して処理することになるだろう。
 エンディアンネス(ビッグエンディアンリトルエンディアン)の違いがあり、どのようなオクテットシーケンスになるかは実装によるが、いずれにせよ現在のコンピューターは8ビット単位で情報を処理する。
 文字コードの世界では、オクテット列で表わされる表現方法をCESという。一方でUnicodeの文字集合はCCSである。ここで問題となるのは中間の状態、UTF-16としての表現方法そのものであるが、このような16ビット形式での表現は新規に「CEF」という用語を作って呼ぶことにした。
 つまり、Unicodeのコードポイント(CCS)→CEF(16ビット)→CES(8ビット)というように変形されていくことになる。

仕様

サロゲートペア
 新たに出来た領域をISO/IEC 10646の1面〜16面として割り当て、ISO/IEC 10646の00群00面〜00群16面の計17面、最大1,114,112文字種まで利用可能となった。
 この技術をサロゲートペアといい、このサロゲートペアを併用するUnicodeの符号化方法をUTF-16という。つまりUTF-16とは16ビットを基準とする可変長エンコードである。
 ISO/IEC 10646の符号UCS-2との差は、このサロゲートペアの機能の有無である。

BOM
 符号化された文書がUTF-16であるかどうかを識別するためと、エンディアンネスを識別するために、文書の先頭にはBOMと呼ばれるバイト0xFEFFが付加される。
 UnicodeでU+FEFFという文字は、ZERO WIDTH NO-BREAK SPACE(幅の無い改行しない空白)という記号である。見えないし改行もされない、存在自体を無視できる文字である。
 リトルエンディアンの場合、先頭2オクテットが0xFF、0xFEとなり、ビッグエンディアンなら0xFE、0xFFとなる。

BOMの無い文書
 BOMが定義される以前の文書には、BOMが無いものもある。
 現在それはUTF-16LEUTF-16BEと呼ばれ、名称でエンディアンネスを識別するようになっている。

補足

コンセプト
 UTF-16では、0〜16面の計17面しか扱えない。しかし、このRFCを書いたFrancois Yergeauは、これで充分だと考えた。
 その根拠は、ISO/IEC 10646の全領域を表現する方法は、実現はできても需要がないからである。UTF-16でさえ100万字の容量があるが、それを全て埋め尽くすほどコードポイントの需要があるとは考えにくい。
 また、いずれUTF-16のエリアのコードポイントに文字がマッピングされるようになれば、徐々に可変長のUTF-16ライブラリより、固定長の符号UCS-4のライブラリが増えるに違いないと考えられた。
 UTF-16の存在意義は、16ビット固定長という従来の枠を破ることのみにあったと言える。

今後
 Unicodeが普及した現在、この予測を改めて考えると、結果は外れたと言える。
 文書ファイルなどでは、UCS-4やUTF-32ではなく可変長のUTF-8が普及することになった。そして、Microsoft WindowsAPIや、JavaのString型などではUTF-16が使われているため、ある意味UTF-16はUTF-8より普及している。
 更に、実質的にUnicodeに飲み込まれたISO/IEC 10646は、符号範囲はUnicodeの範囲(0〜16面)のみに限定されることが決まり、これはISO/IEC 10646:2011で実際に決定した。UCS-4はUTF-32の別名になり、UTF-32であっても16面までしか使われないことになる。
 処理系の内部処理ではUTF-32(UCS-4)となっているものは少なくないと見込まれるが、文書ファイルとしては、予想の通りにUTF-16は廃れUTF-32(UCS-4)に置き換わることは、当分は無さそうである。

再検索