情報の表現

文字コード

1.半角文字

英数文字は,7 ビット(128文字)の番号付けが基本となっている。これをASCII(アスキー, American Standard Code for Information Interchange)コードと呼ぶ。

このASCIIコードにカタカナを付けて8ビットで表したものが,JIS8単位コード(あるいは単にJISコード)である。一方,欧米で使用される 8 ビットコード(ISO Latin 1,正式名称はISO-8859-1)では,最上位ビットが 1 の部分に独仏西文字などを割り当てている。
このように,8ビットで表現される文字を半角文字と呼ぶ。

本来英語圏では,文字は7ビットの ASCII 文字だけでよく,電子メールも7ビットの文字だけを扱うことを前提としていた。現在でもこの前提を基本としているメールシステムが一般的である。PCで8ビットの文字として扱っていても,電子メールを送信する際には最上位ビットを削除して7ビットに変換して送信する。
従って,8ビットでないと表現できない半角のカタカナなどは電子メールでは使えない。半角カタカナを電子メールで使用すると,一番上のビットが削られて別のコードと誤って解釈され,文字化けを起こすなどのトラブルが発生することがある。

ASCIIコード表
JIS8単位コード表
ISO Latin 1 正式名称はISO 8859-1,西欧用文字セット。
 (上のページが文字化けする場合は,ブラウザの文字コードを Unicode (UTF-8) にすること。)

2.全角文字

漢字は2バイトで表現される。これを全画文字と呼ぶ。(注意:全角の英・数・記号も2バイト)

1.1 区点コード

2バイト文字を94個の区(グループ)と94個の点(グループ内の文字の位置)で表現するコードの付け方。(※)
ただこれは文字のグループ分けであって,実際にコンピュータなどで扱うためにコードを割り当てる場合は,この表を元に2バイトの番号を付ける。この付け方に何通りかある。このため,Webブラウザなどで文字化けが起きる。

(※)

94 という個数は,ASCII コードで文字として使えるのは 21(16)から7E(16) までの94個のコードであることによる。

区点コード表

1.2 JISコード (ISO-2022-JP)

1~94の区と点それぞれに順番に21(16) ~7E(16) という番号を付ける。この番号の付け方をすると,各バイトの1番最初のビットが必ず0になる。

「岡」の区点コードは,18区12点である。この文字のJISコードを求める。
上に書いてあるように,1区の文字の上位バイトは21(16),2区の文字の上位バイトは22(16),・・・となるので,
18(10) + 20(16) = 12(16) + 20(16) = 32(16)
より18区の文字の上位バイトは 32(16) である。同様に
12(10) + 20(16) = C(16) + 20(16) = 2C(16)
より,下位バイトは 2C(16) である。
よって,「岡」のJIS コードは 322C(16) である。
1バイト文字と2バイト文字の区別

JISコードは,バイトごとに見ると ASCII コードと同じ値を使用するので,コードを見ただけでは1文字の2バイト文字なのか2文字の1バイト文字なのか判断できない。
例えば上記の 322C の場合,「岡」なのか,「2」(= 32(16))と「,」(コンマ,= 2C(16))の2文字が連続しているのか判断できない。そこで

2バイト文字列の前には 1B 24 42 を
1バイト文字列の前には 1B 28 42 を

置いて,後に続くコードがどちらであるかを指定する。これらを,エスケープシーケンスと呼ぶ。

ただし,1バイトコードを前提にするので,1バイトコードから始まる場合はエスケープシーケンスを置かない。また2バイトコードで終了する場合は,1バイトコード用のエスケープシーケンスを最後に追加する。

注意.

岡山大学のコンピュータ教室に導入している NoEditor は1バイトコードのエスケープシーケンスとして 1B 28 4A を使用している。これは JIS で半角英数への切り替えを示すもので,動作は上記の 1B 28 42 と同じになる。上記の 1B 28 42 は ASCII へのエスケープシーケンスで,こちらを採用するテキストエディタが多い。

「日本はE組」(Eは半角)は
1B 24 42 46 7C 4B 5C 24 4F 1B 28 42 45 1B 24 42 41 48 1B 28 42
 (日:467C,本:4B5C,は:24 4F,E:45,組:41 48)
となる。最後の 1B 28 42 は,最後は必ず 半角コードに戻すというルールがあるため。
電子メールの文字コード

上の半角文字の項にも書いてあるように,インターネット,特に電子メールでは文字コードを7ビットに変換してから送信する場合が多い。メールヘッダの

Content-Transfer-Encoding: 7bit

はこの変換を行っていることを意味する。

JISコードは上記のように各バイトの最初のビットが0であるため,7ビットに縮めても文字コードは変わらない。このため電子メールではJISコードが用いられることが多い。

なお Gmail では標準で JIS ではなく UTF-8 を使用する設定になっている。(UTF-8 でそのまま送信するのではなく,BASE64 という変換をして7ビットコードに変換しているので,問題は発生しない) Gmail でヘッダを確認するには,メールを開いてメール本文右上のプルダウンボタン[その他]から[メッセージのソースを表示]を選択する。

「愛」のJISコードは,0x3026 = 00110000 00100110 であり,各バイトの最初のビットは 0 である。 これを7ビットに縮めて 0110000 0100110 として扱う。

1.3 Shift-JIS コード

MS Windows や Macintosh で使用される。

半角文字の JIS8単位コード表でわかるように,8ビットの文字コードでは 80(16) ~ 9F(16) と E0(16) ~ FF(16) は使用されない。全角文字を表す場合,第1バイトにこのコードを使用することで,全角と半角を区別する。つまり第1バイトを見れば個々の文字が1バイト文字なのか2バイト文字なのかが分る。その結果,全角と半角を切り替えるためのエスケープシークエンスは不要となる。

Shift-JIS は,文字は21~7E,A1~FE を使用するというルールに沿っていないため,公式に認められた文字コードではない。

Microsoft の Codepage を参照。

1.4 EUC コード

UNIX で使用される。1~94の区と点それぞれに順番にA1(16) ~FE(16) という番号を付ける。全角文字と ASCII 文字が別の1バイトコードを使用するので,エスケープシークエンスは不要である。ただし JIS8単位コード のカタカナの部分と重複しているので,半角カタカナは使用できない。

「岡」の区点コードは,18区12点である。この文字のEUCコードを求める。
上に書いてあるように,1区の文字の上位バイトはA1(16),2区の文字の上位バイトはA2(16),・・・となるので,
18(10) + A0(16) = 12(16) + A0(16) = B2(16)
より18区の文字の上位バイトは B2(16) である。同様に
12(10) + A0(16) = C(16) + A0(16) = AC(16)
より,下位バイトは AC(16) である。
よって,「岡」の EUCコードは B2AC(16) である。

1.5 Unicode

上記のようなコード体系には

など,様々な問題がある。

そこで,日本・中国・ハングル・アラビアなど世界の主な国の文字を統一的に扱うために,Unicode が考案された。Unicode では,英数文字も含めてすべての文字を2バイトで表す。つまり,全部で 216 = 65536 種類の文字が使用可能である。(足りなくなって,3バイトの部分を作ってしまった・・・)

使用できる文字一覧については,unicode公式サイトにあるコード表を参照のこと。

実装(UTF-8)

コンピュータで Unicode を扱う場合,そのままのコードではなく UTF-8 を使用する場合が多い。UTF-8 のコード割り当てのルールは,RFC3629 に定められている。UTF-8 では,元のunicodeの値に応じて,次のようにビット数の異なる文字コードを実装する。

Unicode の範囲 Unicode のビット列 UTF-8 のビット列
0x0000 ~ 0x007F (00000000 00000000 ~ 00000000 01111111) 0000 0000 0abc defg 0abc defg
0x0080 ~ 0x07FF (00000000 10000000 ~ 00000111 11111111) 0000 0abc defg hijk 110a bcde 10fg hijk
0x0800 ~ 0xFFFF (00001000 00000000 ~ 11111111 11111111) abcd efgh ijkl mnop 1110 abcd 10ef ghij 10kl mnop
(0xFFFF を超える文字については略)

UTF-8 には以下のような特徴がある。

「岡」(部首は山)の Unicode は

5CA1

これを2進数で表すと

0101 1100 1010 0001

よって「岡」を UTF-8 で表したときのビット列は

1110 0101 1011 0010 1010 0001 (赤字は元の Unicode のビット列) 

となる。これを16進数で表現すると

E5B2A1

である。

演習

秀丸エディタやNoEditor で 岡山okayama と入力し,様々の文字コードを指定して保存せよ。
そのファイルのサイズを確認せよ。
またそのファイルの内容を Stirling などのバイナリエディタで確認せよ。

リンク

日本語と文字コード