文字コード

コンピュータの扱うデータは、 コンピュータの内部ではある仕組みに従って全て数値で表現されています。 しかし、私達はその仕組み、例えば、画像データがどのように数値化されているのか、 動画データがどのように数値化されているのかということは知らなくても、 コンピュータを使っていくことができます。 ただ、文字データがどのように数値化されているのかということは、 コンピュータで日本語だけを扱う場合でも役に立つ知識ですので、 知っておいて損はありません。 ここでは、文字のデータがどのように表現されているのか説明します。

答えだけを先に言うと、実際には、 コンピュータで扱える文字にはひとつひとつ数字が割り振られていて、 コンピュータ内部ではすべて数字として処理されています。 いわば、数字と文字を対応させる暗号表を持っているようなものです。 この文字に割り振られた数字を文字コードと呼びます。 具体的には、順番に説明していきます。

ASCII

まず、英数字、記号を表現するための文字コードを紹介します。

これは、ASCII (American National Standard Code for Information Interchange) コードと呼ばれるもので、 [表1]のように、7ビット (二進数で 7桁) を使って英数字、記号、その他制御文字を表します。 この文字コードは、その名の通り、もともとアメリカで作られたものですが、現在は、国際的に使われています。 もちろん、日本でも使われています。 そのため、この ASCII コードを使えば、世界中のどこでもきちんと表示できることが保証されます。

0 1 2 3 4 5 6 7
0 NUL DLE SPACE 0 @ P ` p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
A LF SUB * : J Z j z
B VT ESC + ; K [ k {
C FF FS , < L \ l |
D CR GS - = M ] m }
E SO RS . > N ^ n ~
F SI US / ? O _ o DEL

[表1]ASCII コード表

ここで、[表1]の一番上の行の数字が十六進数の上一桁、 一番左の列の数字が十六進数の下一桁を表しています。 したがって、例えば、大文字の A は、十六進数で 41 という数で表現されます (十六進数なので、この数字は「よんじゅういち」ではなく「よんいち」と読みます。 なお、以下十六進数を数字の前に `0x' を置いて `0x41' と表記します)。 さらに、十六進数の 0x00 から 0x7F までですので、7ビット使っていることが分かります (十六進数の 0x7F が二進数の 1111111 になります)。

コード表を眺めてみると、十六進数の 0x20 から 0x7E まで見慣れた英数字と記号が並んでいることが分かります (0x20 は空白を表しています)。 さらによく見ると、 アルファベットの大文字、小文字が隣合わせでならんでいることが分かります。 では、それ以外の部分は、なんでしょうか。 これは、制御文字と呼ばれるもので、 通常、私の目に見える形で表示されることはありませんが、 ディスプレイやプリンタを制御するための特殊な文字です。 それぞれ、その制御文字の役割を表す二、三文字の記号で表現されています。 ここで、制御文字を全て説明することはしませんが、この後出てくるものを三つだけ紹介しておきます。

コンピュータの内部では、8ビットをひとまとまりとして扱っているので、 256文字まで同時に扱うことができます。 しかし、この ASCII コードは 7ビットなので、その半分しか使っていないことになります ([表1]を 8ビットの表にすると右半分があまりますね)。 この余った部分を使って、 ドイツ語やフランス語のウムラウトやアクセントを表す文字コード(ISO-8859-1、もしくは、Latin-1 と呼ばれます)や、 日本語の半角カタカナを表す文字コード(JIS X 0201 と呼ばれます)が存在します。

ただ、インターネット上には、 「インターネット上に流れている文字コードは全て 7ビットだ」ということを前提としているコンピュータが存在するので、 メールや Web では、そのままの形で ISO-8859-1 や JIS X 0201 は使ってはならないということになっています。 ですので、メールなどでウムラウトやカタカナを表すためには、これとは別の手段を使います。

日本語の文字コード

前述の ASCII コードは、英数字と記号しか使えません。 では、日本語の文字を表現するためにはどうすればいいのでしょうか。

英語の場合、アルファベットの大文字、小文字、数字、記号、全て合わせても 80文字しかありません。 ですので、7ビットだけで全ての文字を表すことができます。 これが ASCII コードです。 しかし、日本語の場合、ひらがなだけで 80文字以上(濁点、半濁点の付いた文字や「ゐ」や「ゑ」も一文字として数えます)あります。 同じ数のカタカナもありますし、漢字は義務教育で学習する常用漢字だけでも 2136文字あります (常用漢字表(平成22年内閣告示第2号))。 とても、7ビットや8ビットでは表現することはできません。

そこで、日本語を表現するために 16ビット(2バイト)使うことになっています。 16ビットだと、2の16乗で 65536 文字使うことができます。 これだけあれば、日本語の文字を全て表現できそうです。

実際に日本工業規格(JIS)の規格として JIS X 0208 と呼ばれる日本語の文字の集合が定められました。 この規格には、漢字以外が 524文字、漢字は使用頻度にあわせて、 第一水準漢字が 2,965文字、第二水準漢字が 3,390文字の計 6,879文字が含まれています。 この文字の集まりをコンピュータ上で表現する方法として、主に以下の三つの文字コードが使われています。

ISO-2022-JP
JIS コードとも呼ばれ、主に、電子メールなどで使われます。 文字コードの中に「ここからが JIS X 0208 の文字です」「ここまでが JIS X 0208 の文字です」というコードを埋め込むようになっています。 これは、「エスケープ」を使って、前者は `0x1B 0x24 0x42' というコードが、後者は `0x1B 0x28 0x42' というコードが使われます。 このため、日本語一文字に2バイトを使っていますが、実際には、0x7F までしか使用していないので、前述の 7ビットの問題は生じません。
Shift_JIS
「シフト JIS」「Shift-JIS」とも表記され、主に Windows や Mac OS で使われている文字コードです。 日本語の文字を ASCII コードで使っていない 0x80 以降に組み込んでいるので、7ビットの問題があります。 電子メールでは使えません。 Windows でメールを使う時には、メールソフトが自動的に ISO-2022-JP に変換しています。
EUC-JP
EUC とは Extended UNIX Code の略です。 その名の通り、UNIX や Linux などで使われています。 Shift_JIS と同様に 7ビットの問題があります。

現在、日本語の文字の集合としては、前述の JIS X 0208 を拡張した JIS X 0213 という規格が定められています。 これは、JIS X 0208 を拡張したもので、JIS X 0208 に第三水準漢字 1,249文字、 第四水準漢字 2,436字が追加されています。 さらにこの JIS X 0213 は 2004年に改正され、168文字の字体が変更されました。 この改訂版は通称 JIS2004 と呼ばれています。 この JIS2004 では、例えば、「葛」の字の下の部分の形が変更されましたし、 「辻」の字の「しんにょう」の点の数が一つから二つに増えました。 実は、この変更は、戦後すぐ略字体として作られた文字を本来の文字 (中国の清の時代に編纂された「康熙字典」という漢字字典の字体)に戻したものです。

パソコン上では、Windows Vista からこの変更が適用されています。 ですので、このページを Windows XP で見ると「辻」の点は一つ、Vista 以降で見ると「辻」の点は二つになっています。 ただし、Windows XP でも JIS2004 対応のフォントを入れている場合は、JIS2004 の字体で表示されています。 どの文字が変更されたかは、 詳しくは、 JIS2004制定時の変更点 - CyberLibrarian をご覧下さい。 比較的よく使われる文字も多いので、自分の名前や住所で使っている漢字が入っているかもしれません。 これだけの変更が行われると、結構大きな混乱が起きそうな気がしますが、変更自体あまり知られていないようです。 ただし、この変更はあくまでも、コンピュータ上で使う文字集合の字体の変更なので、 通常の印刷物や手書きの文字などで前の字体の文字を使ってはいけないというわけではありません。

文字コードとは少し離れますが、ここで改行コードのお話もしておきます。

ASCII コードの中には、改行を意味する制御文字があります。 歴史的な事情により、0x0A(LF)と 0x0D(CR)の二種類存在します。 実は、OS により、どのように改行を表現しているか異なってきます。 少しややこしいのですが、Windows は CR と LF の組合せで、 Mac OS は CR で、UNIX や Linux、Mac OS Xなどは LF で、 それぞれ改行を表しています。

Unicode

日本語だけでしたら、これで問題は解決するのですが、もちろん世界中には色々な言語が存在します。 日本語以外にも文字がたくさん存在する言語があります。 今までは、言語毎に文字コードを定めて使っていました。 ですので、一つのファイルの中で複数の言語を混在させるのは非常に困難でした。 しかし、1990年代初頭に Unicode と呼ばれるものが登場しました。 これは、世界の全ての文字を共通の文字コードで表現するためのものです。

当初の Unicode は 2バイトの中に全ての文字を収めようとしていました。 日本語だけなら 2バイトあれば十分そうですが、 世界中の言語の文字を収めるためには、2バイトだけではとても足りません。 ですので、特に文字数が多い漢字の領域をできるだけ縮小させる作業が行われました。 これを「ハンユニフィケーション」(Han Unification) と呼びます。 具体的には、中国語(大陸の簡体字と台湾の繁体字)、日本語、韓国語、ヴェトナム語で使われている(使われていた)漢字の中で、 字源が同じ漢字を一つにまとめてしまったのです (第二外国語などで中国語を学習している方はご存知だと思いますが、 同じ意味の漢字でも言語によって字体が異なることが非常に多いです)。

この結果、二万文字ほどにまとめられた CJKV 統合漢字(Chinese, Japanese, Korean, Vietnamese の頭文字を取っています)というものができたのですが、 これでは、各言語の文化を無視しているだけではなく、 本来の目的である多言語の混在ができないという問題が生じてしまいました。

また、全世界のコンピュータで使う以上は正確な規格を制定しなければならないのに、 統合に関していくつも矛盾が存在すると言われています (詳しくは、 この言葉、あの言葉:ハンユニフィケーション(Han unification) Unicodeの矛盾などをご覧下さい)。 現在、この問題は、Unicode を2バイト以上に拡張することにより解決がはかられています。

この Unicode は、現在、OS の内部などでよく使われるようになってきていて、 Windows でも、MacOS X でも内部的には、Unicode が使われています。 なお、実際の文字コードとしては、Unicode の文字コードを変換した UTF-8 というものがよく使われます。


「ネットワークの利用」に戻る / 「様々な文書フォーマット」に進む

「今回の授業のトップ」に戻る / 「授業のホーム」に戻る