Unicode

Unicodeの文字コード体系には、2種類あるのをご存知でしょうか?
Unicodeと言っても多くのエンコーディングが存在します。ちょっと整理してみましょう。

Unicodeの仕様は、Unicode Consortiumによって作られています。最新仕様はVersion 4.0です。
ややこしいことに、Unicodeは、ISO/IEC 10646の一部(UCS-2,UCS-4)としても標準化されています。
更に、日本では、ISO/IEC 10646-1がJIS X 0221 国際符号化文字集合としてJIS規格化されています。

Unicode Version4.0
エンコード説明
UTF-77ビットコードを組み合わせて文字を指定する方式。
電子メールなどの7ビット文字しか利用できない場合を想定してつくられている。
UTF-8ASCII文字と互換性を持たせるためにASCIIと同じ部分は8ビット、
その他の部分を16〜32ビットで指定するコード。
UTF-16BMP面を16ビット、その他をサロゲートペアという仕組みを使い32ビットで指定する文字コード。
OSなどの内部コードはこの形式が使われる。UCS-2ともBMP面の範囲で互換性がある。
エンディアンの順序によってUTF-16LE/UTF-16BEと区別したエンコードもある。
UTF-32Unicodeの全コードを単一長のコードとして32ビットで指定するコード。
実際に使われるのは21ビット。Unicodeの範囲内ではUCS-4と互換性がある。

ISO/IEC 10646
エンコード説明
UCS-2Unicode とおなじBMP(基本多言語面)のみを使う場合の16ビットコード。
UTF-16のようにBMP以外の文字を使うことはできない。
UCS-431ビットを使うコード。
UTF-32と似ているが、Unicode以外のコードも定義されれば使用できるという点が異なる。
UTF-8UnicodeのUTF-8とほぼ同じ。
31ビットに対応するため6バイト長まで拡張されている。

TclとUnicode

Tcl8.1から国際化対応になり、Tclの内部ではUnicode(UTF-8)が使われています。
encoding namesコマンドで確認するとunicodeとutf-8のエンコーディングが存在します。
Tclのエンコーディング名と実際のエンコーディング名の対応は以下の通りです。

Tclのエンコーディング
Tclエンコーディング名実際のエンコーディング名
unicodeUCS-2
utf-8UTF-8

Tclは、UTF-16(UTF-16LE,UTF-16BE)とUCS-4(UTF-32)には対応していません。
ただし、Tcl8.4.4からビルドオプションでUCS-4をサポートしています。
すべてのエンコーディングに完全対応するのは、Tcl9.0あたりからと噂されています。
世の中的にUCS-4は時期尚早?って感じですが、UTF-16は早期にサポートして欲しいですね。

OSのUnicode対応

今のところ、WindowsとJavaはUCS-2までの対応で、多くのUNIXはUCS-4をサポートしているようです。

参考文献