文字コード

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

文字の判定方法や、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コードと同じ文字数しか扱えませんが、エスケープシーケンスによって扱える文字を増やしています。

ISO-2022-JPの符号化方式

 エスケープシーケンスで扱える文字を切り替えますが、切り替えて使える文字範囲(上図の箱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」になります。

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

Shift_JIS

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

Shift_JISの1バイトコード

 太枠の部分は、この数字が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バイトコード

 太枠部分の数字がマルチバイト文字の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が余計)

 UTF-16は、Windows10等のシステム標準で使われています。又、最近のHTMLでは、UTF-8が推奨されています。これは、ASCII互換でないと、文字コードの指定を読み取れない可能性があるためです。又、UFT-8であれば言語が違う環境で表示されても、文字化けせずに表示出来る可能性があります。

 従って、これからのHTML文書で文字コードを指定する時は、UTF-8がお薦めです。<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">です。

  • このエントリーをはてなブックマークに追加