文字コード

文字コードについて説明したページです。

文字の判定方法や、HTMLで推奨の文字コードなどについて説明しています。

文字コードとは

文字コードは、1つ1つの文字に対して数字を割り当てたものです。

例えば、ASCIIコードは、7ビットを使って以下のように割り当てています。

ASCIIコード表

7ビットの内、上位3ビットは水色のように0〜7と表しています。2進数の000〜111(3ビット)が、16進数で0〜7になるためです。下位4ビットは薄緑のように0〜Fと表しています。

表の見方としては、例えば「A」は41が割り当てられています。メモ帳などで保存すると、この数字が保存されます。ASCIIコードは、英数字や一部記号が扱えますが、平仮名や漢字は扱えません。詳細は、「ASCIIコード表」をご参照下さい。

ASCIIコードに似た文字コードとして、EBCDICコードがあります。EBCDICコードで「A」は16進数のC1です。このため、ASCIIコードで保存したファイルは、EBCDICコードを使う機器で開くと異なる文字になってしまいます。

ISO-2022-JP(JISコード)

ISO-2022-JPは、平仮名や漢字も使える日本語向け文字コードです。ASCIIコードと同じ7ビット、もしくは8ビットを使っています。7ビットだとASCIIコードと同じ文字数しか扱えませんが、エスケープシーケンスによって扱える文字を増やしています。

文字コードのエスケープシーケンス役割

エスケープシーケンスで扱える文字を切り替えますが、切り替えて使える文字範囲(上図の箱1つ1つ)を文字集合と言います。使えるエスケープシーケンスとその16進数、対応する文字集合の例は、以下の通りです。

【ISO-2022-JPのエスケープシーケンス(例)】
エスケープシーケンス 16進数 文字集合
ESC ( B 1B 28 42 ASCII
ESC ( J 1B 28 4A ラテン文字
ESC $ B 1B 24 42 平仮名や漢字

例えば「test」という文字列は、コードが「74 65 73 74」になります。これは、ASCIIコードと同じです。ASCIIコードの範囲だけであればエスケープシーケンスを使わなくて済みます。これにより、他のASCII互換の文字コードで保存したファイルでも、英数字だけであれば文字化けしません。

また、平仮名や漢字は7ビットでは不足するため、7ビット+7ビット(もしくは8ビット+8ビット)で表現します。このように、1バイト(8ビット)で表せない文字を、マルチバイト文字と呼びます。

例えば、「漢字test」という文字列は「1B 24 42 34 41 3B 7A 1B 28 4A 74 65 73 74」になります。

赤字部分(1B 24 42)が平仮名や漢字を使うためのエスケープシーケンス、青字部分(1B 28 4A)がラテン文字を使うためのエスケープシーケンスです。ラテン文字はASCIIとほとんど同じですが、「\」が「\」になるなど少し違いがあります。つまり、日本語環境向けです。「漢」は34 41、「字」は3B 7Aでマルチバイト文字です。

Shift_JIS

Shift_JISも、平仮名や漢字が使える日本語向け文字コードです。Shift_JISでは、ASCIIコードを拡張して8ビットを使い、半角カナが扱えるようにしています。

Shift_JISコード表

太枠の部分は、この数字が1バイト目に現れるとマルチバイト文字と識別します。例えば、82 A0は1バイト目の82が太枠内のため、マルチバイト文字と判断でき、2バイト目のA0との組み合わせで「あ」となります。

ISO-2022-JPでは、マルチバイト文字の領域は1バイト目が21〜7Eでしたが、ASCIIコードと重複しています。例えば、21であれば「!」が該当します。これが「!」なのか、マルチバイト文字なのか区別するためにエスケープシーケンスが必要でした。

Shift_JISでは、マルチバイト文字の1バイト目を未定義部分にズラして(シフトして)使うようにしています。このため、マルチバイト文字との区別にエスケープシーケンスを必要とせず、ASCIIコードとの互換もあります。

Shift_JISは、日本語のMS-DOSで採用された事から利用率が高く、日本語を使うHTML文書の文字コードとしても広く使われていました。

EUC-JP

EUC-JPも、平仮名や漢字が使える日本語向け文字コードです。基本的な考え方は、Shift_JISと同じです。但し、半角カナは2バイトで表現されています。

EUC-JPコード表

太枠部分の数字がマルチバイト文字の1バイト目を示します。例えば「あ」の文字コードは、A4 A2となります。

8E部分は半角カタカナ用で、8E A1〜8E DFまで割り当てられています。

EUC-JPはUNIX機で採用されたことから、パソコンとUNIX機の間でテキストファイルを交換した際は、文字コードを変換する必要がありました。

Unicode

これまで説明してきた文字コードは、ASCIIを除いて日本語向けです。ISO-2022-KR、EUC-KR(共に韓国語)などそれぞれの言語向けに文字コードがあります。

Unicodeは、それぞれの言語でバラバラだった文字コードを、1つの文字コードで表現できるように作られました。Unicodeで代表的なのは、UTF-8とUTF-16です。

UTF-8
1〜4バイトで文字を表します。つまり、文字コードは8ビット(1バイト)単位に可変です。00〜7FまではASCIIコードと同じで、80以降は2〜4バイトのマルチバイト文字用です。このため、ASCII互換があります。
UTF-16
2バイトか4バイトで文字を表します。つまり、文字コードは16ビット(2バイト)単位に可変です。例えば、「A」は2バイト使って00 41となるため、ASCII互換がありません。(00が余計)

最近のHTMLでは、UTF-8が推奨されています。これは、ASCII互換でないと、文字コードの指定を読み取れない可能性があるためです。UFT-8であれば、言語が違う環境であっても、文字化けせずに表示できる可能性があります。

したがって、これからのHTML文書で文字コードを指定する時は、UTF-8がお薦めです。文字コードをUTF-8にするためには、head要素内で<meta charset="utf-8">と記述します。