Unicode, UCS-2/4, UTF-8/16/32についての整理

※注意:これは私が調べた結果をまとめたものなので、間違いがあれば指摘していただけるとありがたいです。

用語

ここで整理したいことについて話せるようにするための説明なので、正確ではないです(符号化文字集合とか符号点とか)。

文字集合
文字の集合
符号化文字集合
文字と負ではない整数(または整数列)の対応表。その整数が、コンピュータで扱うビットの並びそのものとは限らない。コンピュータでは、この整数を符号化方式によって変換したものを扱う。
符号点、符号位置、コードポイント
符号化文字集合で、文字に対応している整数(または整数列)のこと。「符号位置」はUnicodeでの呼び方。
符号化方式
符号点を、コンピュータで扱うビット列で表現するための変換方式。よく「エンコーディング」と呼ばれるものはこちら。符号化符号化うるさいので、ここでは「エンコーディング」ということにする。

※「符号化文字集合」と「符号化方式」が指す「符号化」の意味は多分違う。前者のそれは文字に番号(符号)を振ったことを言い、後者は符号をコンピュータが扱うためのビット列に変換することを言うと思う。

UnicodeとUCS

Unicodeとは符号化文字集合の名前であり、UCSは符号化文字集合の規格である。UCSでは、UCS-4とそのサブセットであるUCS-2の2種類の符号化文字集合が定められている。
Unicodeはもともと16ビットで表現した符号空間に文字を割り当てていたが、足りなくなったので後に21ビットに拡張した。
UCSは、31ビットで表現される符号化文字集合で、Unicodeとは別に作られていたが、最終的に当時16ビット空間であったUnicodeをまるまる取り込むことになった(このため下記のような互換性が発生している)。この16ビットの部分が、そのままUCS-2である。

コードポイントの表記法

Unicodeのうち、16ビットで表現できるコードポイント、およびUCS-2ではU+XXXXと表記する。Xは16進一桁。Unicodeにおいて21ビットに拡張された部分にあるコードポイントついては、適宜5, 6桁で表記する。また、UCS-4では8桁、U+XXXXXXXXと表記する。

UTF-8, UTF-16, UTF-32について

UCS, Unicodeともに、UTF-8, UTF-16というエンコーディングを定めている。つまり、UCSのいうUTF-8と、UnicodeのいうUTF-8は規格としては別物である(UTF-16についても然り)。
ただしどちらの規格のUTF-8/16も、変換の計算方法は同じで、U+0000〜U+FFFFの範囲では同じ配置になっているため、この範囲に限れば最終的なビット列にしても違いはない。(U+10000より後がどうなのかは知らない)。
Unicodeには更に、UTF-32というコードポイントをそのままコンピュータで扱うバイト列とするエンコーディングが定義されている。UCSには存在しないが、UCS-4は、そのままエンコーディングでもあるので、実質UTF-32とは同等である。
UCS-2もまたそのままエンコーディングでもあるが、こちらはサロゲートペアについての規定がないので、UTF-16とは違ってU+10000以降の文字は扱えない。
個々のエンコーディングの具体的な計算方法は省略。

要約すると、

ここには書いていないこと

  • UTF-8/16が具体的にどのようにして符号をバイト列に変換しているのか
  • UnicodeUTF-16/32にはバイトオーダーの話
  • 符号点と群・面・区・点、BMP
  • いくつかのコードポイントからなる合成文字について

分からないこと