文字コードの扱いに苦労したのでメモしてみた。
正しく理解しようと少しばかり試みたものの、どうもにわかには無理そう。
自分なりの理解は、”だいたいこんな感じ”。
文字コード
コンピュータで文字を扱う際の文字のコード(ビット列)。
ただし、このビット列は(文字)符号化方式毎に別々に割り振られている(同じ値が割り振られている場合もある)ので、「この文字の文字コードはなに?」なんて聞き方ができない。「この文字のShift-JISコードはなに?」って聞き方をすれば、Shift-JISでエンコードしたときの文字コードを聞いているんだな、とわかる。ゆえに文字コードを語るときは、文字符号化方式とセットで扱う。実際に文字コードという言葉はそのように運用されることが多いみたいだ。よって、改めて定義してみると、次のように言えると思う。
文字コードとは、ある文字符号化方式によって文字をエンコードして得られるビット列のことで、”<文字符号化方式>コード”と呼称する。
たとえば、
JIS(iso-2022-jp)コード
Shift-JISコード
EUC-JPコード
UTF-8コード
Shift-JISコード
EUC-JPコード
UTF-8コード
符号化文字集合(CCS:coded code set)
文字コードを割り当てることを目的とした文字の集合。
符号化文字集合と文字コードは直接関係なく、符号化文字集合の文字には番号(ビット列ではない)が割り振られている。
「この文字コードは、〇〇の要素XXを△△で符号化して得られたバイト列」の〇〇にあたるのが、符号化文字集合。
例えば、
2422は、JIS X 0208の要素”あ”をiso-2022-jpで符号化して得られたバイト列。
82A0は、JIS X 0208の要素”あ”をShift-JISで符号化して得られたバイト列。
A4A2は、JIS X 0208の要素"あ"をEUC-JPで符号化して得られたバイト列。
82A0は、JIS X 0208の要素”あ”をShift-JISで符号化して得られたバイト列。
A4A2は、JIS X 0208の要素"あ"をEUC-JPで符号化して得られたバイト列。
こんなイメージ
a = JIS X 0208('あ')
a.iso-2022-jp = 2422
a.Shift-JIS = 82A0
a.EUC-JP = A4A2
a.iso-2022-jp = 2422
a.Shift-JIS = 82A0
a.EUC-JP = A4A2
別の例
2422は、Unicodeの要素”あ”をiso-2022-jpで符号化して得られたバイト列。
82A0は、Unicodeの要素”あ”をShift-JISで符号化して得られたバイト列。
A4A2は、Unicodeの要素"あ"をEUC-JPで符号化して得られたバイト列。
E38182は、Unicodeの要素"あ"をUTF-8で符号化して得られたバイト列。
82A0は、Unicodeの要素”あ”をShift-JISで符号化して得られたバイト列。
A4A2は、Unicodeの要素"あ"をEUC-JPで符号化して得られたバイト列。
E38182は、Unicodeの要素"あ"をUTF-8で符号化して得られたバイト列。
こんなイメージ
a = Unicode('あ')
a.iso-2022-jp = 2422
a.Shift-JIS = 82A0
a.EUC-JP = A4A2
a.UTF-8 = 38182
a.iso-2022-jp = 2422
a.Shift-JIS = 82A0
a.EUC-JP = A4A2
a.UTF-8 = 38182
文字コードは文字符号化方式に対応しているようで、符号化文字集合が違っていても、同じ文字符号化方式でエンコードすれば同じ文字コードになるみたいだ(?)。
では、符号化文字集合って一つあればよいのでは?
符号化文字集合と文字符号化方式は別体系で、符号化文字集合は複数つくられてしまっているのだから仕方なし。
「こんな符号化文字集合を作ってみました」
「この符号化文字集合を符号化する規則(文字符号化方式)を作ってみました」
別々の規格。
文字符号化方式Xは符号化文字集合Aを符号化できる規則である。
文字符号化方式Xは符号化文字集合Bを符号化できる規則である。
符号化文字集合Aには"あ"という文字が含まれ、Xでデコードできる。
符号化文字集合Bには"あ"という文字が無いので、Xでデコードできない。
文字符号化方式Xは符号化文字集合Bを符号化できる規則である。
符号化文字集合Aには"あ"という文字が含まれ、Xでデコードできる。
符号化文字集合Bには"あ"という文字が無いので、Xでデコードできない。
まず符号化文字集合があり、それを符号化するための文字符号化方式がある。
文字符号化方式は、対象とする符号化文字集合を符号化するメソッドであって、
どの符号化文字集合を対象とするかは文字符号化方式のほうで決めている。
だから、たとえば
UTF-8はUnicode用の文字符号化方式としては使えるが、JIS用としては使えない。
Shift-JISはUnicode用の文字符号化方式として使え、JIS用としても使える。
(Unicodeは統一を目指しているので、多くの文字符号化方式に対応している。)
文字コード表
ある符号化文字集合の文字一覧に文字コードを併記して、文字と文字コードの対応を記した表で、符号化文字集合の各文字の番号を文字符号化方式でビット列に変換するルール表。
符号化文字集合は、群(最上位バイト)・面(2バイト目)・区(3バイト目)・点(最下位バイト)という番号で文字を特定できるようになっている(例えば2バイトで表現できる集合の場合には群・面は不要なので無い)。点のことをコードポイントという。
Unicodeの場合、すべての文字をU+非負整数値の、コードポイントのみで表す。UnicodeにはUCS-2、UCS-4というセットがある。UCS-4をUnicodeと呼び、UCS-2はUCS-4のもととなった文字集合で、UCS-4の0群・0面がUCS-2と同じになっている。UCS-2を拡張したものがUCS-4という関係。
ASCIIの場合、群・面・区・点の概念はなく、文字に直接1バイトの文字コード(ASCIIコード)を対応させている。
JIS X 0208の場合、区と文字コードの下位4ビット以外をオフセットとして対応させ、下位4ビットと点(0~Fの16進数値)を一致させた表で対応させている。
文字符号化方式(CES:Character Encoding Scheme)
文字(記号)に割り振られた番号と文字コード(符号)の変換ルールを文字符号化方式(エンコード)という。
バイト文字とワイド文字
符号化文字集合の符号化方式の特徴による体系
シングルバイト文字集合・・・すべての文字を1バイトで表現。char型
ダブルバイト文字集合・・・すべての文字を2バイトで表現。char型
マルチバイト文字集合・・・すべての文字を複数バイトで表現。char型
※これらの文字は総じて「バイト文字」と呼ばれる。ダブルバイト文字集合・・・すべての文字を2バイトで表現。char型
マルチバイト文字集合・・・すべての文字を複数バイトで表現。char型
ワイド文字集合・・・すべての文字を2バイトで表現。wchar型
ワイド文字集合に分類される符号化文字集合の代表がUnicode。
ダブルバイト文字集合と同じみたいだけれど、集合としてことなる分類なので別もの。ワイド文字集合に分類される符号化文字集合の代表がUnicode。
あと、型が違う。