UTF-16
読み:ユーティーエフ-じゅうろく
外語:UTF-16: UCS Transformation Format-16
Unicode
や
ISO/IEC 10646
の符号化方法(
CES
)の一つ。
サロゲートペア
という方法で、16ビットの範囲を超える文字を扱えるようにした。
RFC 2781
で情報提供扱いで規定されている。
目次
起源
特徴
構成
CESとCEF
仕様
サロゲートペア
BOM
BOMの無い文書
補足
コンセプト
今後
起源
Unicode 3.0
以降で採用された符号化方法である。
Unicodeは元々は「16ビット固定長」の文字集合であり、ISO/IEC 10646用語では
基本多言語面
(BMP)と表現される集合である。従って扱える文字数は2
16
で最大65,536文字に限られた。
そこでこのUnicodeの中で未定義だった領域に、
サロゲート
と呼ばれる1024個の領域を二つ(0xd800〜0xdb00と0xdc00〜0xdf00)用意し、これを組み合わせ1,024×1,024=1,048,576個の文字を扱えるようにした。
この文字数は、BMPの大きさである65,536(2
16
)の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-16LE
や
UTF-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 Windows
の
API
や、
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)に置き換わることは、当分は無さそうである。
再検索