なぜ世界には文字コードが複数あるのでしょうか。
その理由は、文字コードの歴史を辿ってみることで理解できます。
各国用の独自文字コードの誕生
アメリカで開発されたASCIIを起点として、各国用の独自文字コードが開発されていきました。
ASCII
正式名称:American Standard Code for Information Interchange
アメリカで使うことを想定されて開発された文字コードです。
1文字=7ビットで表現され、全128符号位置を持ちます。
アルファベットと記号を表すだけであれば、十分な領域を持っているといえるでしょう。
ISO/IEC 646
コンピュータが世界で使われるようになると、ASCIIだけでは、文字種が足りなくなってきました。
その要望を満たすための文字コードとして、ISO/IEC 646が誕生しました。
ASCIIを基本とし、その中から自由に変更してよい文字をいくつか用意し、独自拡張して使用することを想定した文字コードです。
例えば、通貨記号を自国のものに変更して使用します。
JIS X 0201
ISO/IEC 646を日本用に拡張したものです。
8ビットと7ビットの運用を想定しています。
8ビットの場合は、GL領域にASCIIの拡張であるラテン文字集合を、GRに片仮名集合をロードして使用します。
7ビットの場合は、制御文字でラテン文字集合と片仮名集合を切り替えて使用、もしくは切り替えずに一方だけを使用します。
多言語対応
各国独自の文字コードが開発されていく中で問題となったのが、多言語間での互換性です。
多言語間での互換性を保つために、以下のような文字コードが開発されてきました。
ISO/IEC 2022
多言語間での互換性のために誕生したのが、ISO/IEC 2022です。
ISO/IEC 2022 は、GLとGRの領域を持ち、一般的にGLにASCII、GRに拡張用の文字集合をロードして使用します。
また、これらの領域にロードする文字集合は切り替えが可能です。
つまり、ロードする文字集合を切り替えることによって、多言語での互換性が保たれています。
文字集合は、定められた制御文字によって指定します。
その制御文字が現れたら、以降はその制御文字に対応する文字集合として扱うとISO/IEC 2022が判断するわけです。
ISO/IEC 2022 は、あくまで文字集合をロード、切り替えるという枠組みの仕様を制定しただけのものになります。
どのような文字が使用できるかは、ロードする文字集合によって決まります。
また、2バイトコード(1文字を2バイトで表現する)にも対応しています。
例えば、日本語文字の2バイトコードの文字集合であるJIS X 0208をロードして使用することもできます。
2バイトコードを使用すれば、表現できる文字種別が 94*94=8,836文字 まで増えます。
EUC-JP
ISO/IEC 2022は、文字集合を動的にロードすることができますが、中には切り替えずに使用する文字コードも存在します。
例えば、日本語用文字コードである、EUC-JPは、GLにASCII、GRに漢字集合(2バイト)をロードし、固定したまま使用します。
各国の変遷
ISO/IEC 2022は、動的に文字集合を切り変える枠組みを提供していましたが、当初は国際間通信の必要性はそこまで高くはありませんでした。
そのため、実際にはEUC-JPのように「ASCII + 自国用の文字集合」というような使われ方が主でした。
そのため、各国で以下のように自国専用の文字コードが開発されていきました。
日本、東アジアの変遷
日本では、文字種類の多い漢字を表現するために、2バイトコードであるJIS X 0208が開発されました。
しかし、これは1文字=1バイトで表現しているASCIIと互換性がありませんでした。
ASCIIと互換性を保つためには、1バイトで表現できるものは1バイトに、そうでないものは2バイトで表現する必要があります。
そこで、Shift_JIS、EUC-JP、ISO-2022-JPといった文字コードが開発されていきました。
このような1バイトコードと2バイトコードが混在する自国用の符号化方式は、東アジア(中国、韓国など)の各国で作られていきました。
ヨーロッパの変遷
ヨーロッパはアルファベットを主体としているため、日本語ほどの文字種別を必要とはしません。
しかし、各国の独自文字を考慮すると、1バイトコードでヨーロッパの全域の文字を網羅することはできませんでした。
なので、ひとまず地域単位(西ヨーロッパ、東ヨーロッパなど)で統一された文字集合を作りました。
GL領域にASCII、GR領域に各地域に応じた文字集合を割り当てて使うことで、地域単位で統一された符号化方式が誕生しました。
これをISO/IEC 8859といいます。
ISO/IEC 8859は特定の符号化方式ではなく、上記のような使われ方をする符号化方式全般を指す名称です。
例えば、GR領域に西ヨーロッパ各国の特殊文字を読み込んだものは、ISO/IEC 8859-1(通称:Latin-1)といいます。
このように、国ごとだった符号化方式が地域ごとにまとまったため、その地域では情報のやり取りがしやすくなりました。
しかし、地域をまたいだ場合は、依然としてGR領域の切り替えが必要でした。
文字コードを全世界で統一する
ISO/IEC 10646、Unicode
しばらく各国で独自の文字コードが開発されていきました。
しかし、社会・経済のグローバル化が加速するに伴い、全世界で統一された規格が必要になってきました。
そのための規格として、同時期にISO/IEC 10646、Unicodeという二つの規格が考案されました。
ISO/IEC 10646 は、1文字4バイトとして扱い、それまでによく使われていたISO/IEC 2022との互換性を保っています。
一方、Unicode は、1文字2バイトとして扱えますが、文字集合を再統合、整理したため、既存規格との互換性は乏しいです。
同じような規格が2つ存在することは、混乱を招くということで設計はUnicodeの方に寄せられつつ、二つは統合されました。
UTF-16、UTF-8
全世界の統一規格としてUnicodeが開発されましたが、全世界の文字種類を2バイト網羅することが不可能であることがわかってきました。
そこで、1文字を4バイトで表現するような符号化方式が考案されました。
それが、UTF-16やUTF-8といった符号化方式です。
上記のように統一の規格が誕生しましたが、全世界でこれらの文字コードが使われているわけではありません。
過去の資産で古い文字コードが使われているなど、容易に移行できない理由があるためです。
まとめ
文字コードは、ASCII→自国用文字コード→全世界統一規格、といった流れで進化していきました。
当初は1文字=7ビットの想定でしたが、文字種別が増えるにしたがって1文字の容量は1バイト、2バイトと増えていきました。
さらに、今までの文字コードとの互換性を保つために、今まで1バイトで表現していたものは1バイトで表現しないといけないなどの複雑な事情も生まれてきました。
このような事情により、世界にはたくさんの種類の文字コードが存在するのです。