プログラマのための文字コード技術入門
UnicodeとUTF-8とUCS-2の関係 ――符号化文字集合? 文字符号化方式?
UnicodeとUTF-8とUCS-2,UCS-4など,Unicode関連用語は,いわゆる用語解説にあたるだけでは理解するのに混乱しがちな話題かもしれません。それぞれの用語が登場した経緯や,符号化文字集合,符号化方式としてどういった存在かについて追っていくと,きちんと理解されることと思います。ここでは,簡単に整理してみることにしましょう。
まとめると,Unicodeは整数値で表される符号位置と文字とを対応付けています。そして,その整数である符号位置をコンピュータで用いるバイト列の形で表現するための方式として,UTF-8やUTF-16やUTF-32といった各種の符号化方式が定められており,用途に応じて使い分けるようになっています。
たとえば,「山」という文字の符号位置はU+5C71だということがUnicodeとして決まっています。符号位置の整数値0x5C71をUTF-16で符号化すると5C71という2バイトに,UTF-8で符号化するとE5 B1 B1という3バイトに,UTF-32では00 00 5C 71という4バイトになるということです(ここではUTF-16とUTF-32のバイト順としてビッグエンディアンを採用しています)。
ただし,歴史的な経緯としては,上に述べたような「整数値の符号位置を符号化方式によってバイト列に符号化する」という概念が元々あったわけではありません。当初は,Unicodeといえば16ビット固定長のコードというのが売り文句だったように,「山」という文字に5C71という16ビットのビット組み合わせが対応するというのがUnicodeで定義される内容でした。これはISO/IEC 10646で規定されるUCS-2と同じです。
Windowsのメモ帳のファイル保存のダイアログで,文字コードの選択肢として現れる「Unicode」は,実際にはUTF-16を意味しています。これは,かつてUnicodeが16ビット固定長の文字コードであったことの名残りといえるでしょう。メモ帳ではUTF-8は「Unicode」とは別に「UTF-8」として選択肢に現れます。
時々「UCS-2は符号化文字集合なのか文字符号化方式なのか」といった悩みを見かけることがあります。UCS-2は符号化文字集合だと聞いたけど,UTF-16は符号化方式のはずだ。でもUTF-16はUCS-2の拡張だという。すると一体……?ということでしょう。
用語はひとまずおくとして,肝心なのは中身です。UCS-2が定める内容というのは,上に記したような,「山という文字に5C71という16ビットが対応する」といった対応付けの規則の集合です。それを符号化文字集合と呼ぶか文字符号化方式と呼ぶかは,用語の定義次第でどちらにも言えます。用語法にはいくつかの流派があるので,どれを採用するかによって呼び方も変わります。ただ,こうしたUCS-2の定義内容が,ISOで以前から使われている「符号化文字集合」(coded character set)(※注)にちょうど合致することは確かです。
- ※注)
- ISO/IEC 10646:2003「Information technology -- Universal Multiple-Octet Coded Character Set (UCS)」の4.9項に,この用語の定義があります。