文字コードの話 (1) - ASCII

文字コードについて調べたことをまとめます。

関連記事

目次

基本概念

文字コード(符号点, 符号位置, character code, code point)とは、図形である文字の集合符号化文字集合(CCS, coded character set, code page)に含まれるそれぞれの文字に割り振られた符号のことである。
我々が扱うコンピューターは、符号化文字集合に対応する文字符号化方式(CES, character encoding scheme)によってコードポイントバイト表現を相互に変換することで、文字情報を記録したり文字図形をディスプレイに表示したりしている。

しかし、「文字コード」という言葉は上記の定義に反して符号化文字集合や文字符号化方式を指して使われることがある。この記事では混乱を防ぐため、「文字コード」の代わりに「コードポイント」あるいは「符号位置」という言葉を使うことにする。

例えばJIS X 0208において、文字「あ」のコードポイントは「4区2点」であり、このコードポイントをShift_JISでエンコードすると0x829Eとなる。

ASCII

ASCII

ASCII(American Standard Code for Information Interchange)は、1963年に制定された初期の文字エンコード規格。数字・ラテン文字・主要な記号・制御文字を7bitのbit列に割り当てたコードページ。エンコードはされずコードポイントがそのままbit列となる。
IANA(Internet Assigned Numbers Authority)には「US-ASCII」という名称で登録されている。

ASCII
(灰色部分は制御文字と未定義領域)
0123456789ABCDEF
0 
1
2 !"#$%&'()*+,-./
30123456789:;<=>?
4@ABCDEFGHIJKLMNO
5PQRSTUVWXYZ[\]^_
6`abcdefghijklmno
7pqrstuvwxyz{|}~
  • 最初の32文字は制御文字として定義されている。制御文字は文字図形を表す文字ではなく、ディスプレイやプリンターに対して命令を送るための信号を表す。
    ほとんどの文字はコンピューターの利用者が意識することはないが、0x09=\t(水平タブ)0x0A=\n(改行) など見慣れたコードポイントもこの制御文字に含まれている。
  • コードポイント0x7Fは未定義。

ISO/IEC 646

ASCIIには「$」といったアメリカ特有の記号がある他、ヨーロッパ諸国ではASCIIに定義されている以外の文字も扱われるためASCIIでは十分な表現ができないという問題があった。
そこで1967年にECMAとISOは、ASCIIを一般化したISO/IEC 646という規格を制定する。ISO/IEC 646はASCIIの一部のコードポイントを各国の文字コード実装においてある程度自由に定義できる領域と定め、ASCIIはISO/IEC 646の実装の一つという位置付けとなった。

ISO/IEC 646には多数の実装があるが、例えばDIN 66003(ドイツの規格)ではASCIIと比べて0x5Bが「Ä」となっているといった変化がある。(ASCIIでは「[」)

DIN 66003
(黄色はISO/IEC 646で変更可能と定められているコードポイント、紫色はDIN 66003で実際に変更されたコードポイント)
0123456789ABCDEF
0 
1
2 !"#$%&'()*+,-./
30123456789:;<=>?
4§ABCDEFGHIJKLMNO
5PQRSTUVWXYZÄÖÜ^_
6`abcdefghijklmno
7pqrstuvwxyzäöüß

しかしながら、ISO/IEC 646はあまり使われることがなく、欧州では後述のISO/IEC 8859が一般的となる。

JIS X 0201

日本ではISO/IEC 646に準拠したISO646-JP(Code Page 895)という規格が制定され、更にそれを8bitに拡張してカタカナを加えたJIS X 0201(旧JIS C 6220)というコードページの規格が1969年に作られた。IANAには「JIS_X0201」として登録されている。
この規格は後にShift_JISで用いられることとなる。

JIS X 0201
0123456789ABCDEF
0 
1
2 !"#$%&'()*+,-./
30123456789:;<=>?
4@ABCDEFGHIJKLMNO
5PQRSTUVWXYZ[\]^_
6`abcdefghijklmno
7pqrstuvwxyz{|}~
8
9
A
Bソ
C
D
E
F

ISO/IEC 8859

ASCIIやISO/IEC 646では不足している文字表現のため、1987年にISO/IEC 8859が制定された。ISO/IEC 646では7bitしか使っていなかったが、ISO/IEC 8859では8bit目を利用して表現可能な文字の数を2倍に増やした。
しかし、8bitまで使ってもまだ必要な全ての文字を収録することはできなかったため、ISO-8859-nという形で複数のコードページを定義することとなった。(n=1, ... 16)

例えばISO-8859-1は以下のように定義されていて、ドイツ語・フランス語・フィンランド語・デンマーク語などヨーロッパの広い範囲の文字を収録している。

ISO-8859-1
0123456789ABCDEF
0 
1
2 !"#$%&'()*+,-./
30123456789:;<=>?
4@ABCDEFGHIJKLMNO
5PQRSTUVWXYZ[\]^_
6`abcdefghijklmno
7pqrstuvwxyz{|}~
8
9
A ¡¢£¤¥¦§¨©ª«¬­®¯
B°±²³´µ·¸¹º»¼½¾¿
CÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏ
DÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞß
Eàáâãäåæçèéêëìíîï
Fðñòóôõö÷øùúûüýþÿ
  • 余談だがJava 1.5以前ではpropertiesファイルはISO-8859-1でエンコードしなければならないと定められていた。

参考