10.5 文字コード
コンピュータの中では,様々な情報は2進数によって表され,情報量を持つということを見てきました.ここでは,実際に文字情報がコンピュータ内でどのように表されているのかについて,具体的に見てみましょう.
コード化
コンピュータ内では,文字情報は数値と対応づけることによって表現されます.文字情報を数値と対応づけるということは,どのようなことなのでしょうか.例えば,アルファベットを0から25までの数値に順番に当てはめていくことによって,アルファベットを数値として扱うことができます.実際のコンピュータでは,対応づけされる数値としてはコンピュータが理解することのできる2進数が使われます.また,数値と対応づけられる文字情報には,アルファベット以外にも数字や記号,空白や改行(機能コード)が含まれます.
このように,文字に限らず情報を数値に対応づけることをコード化と言います.また,コード化された記号全体をコード系と呼び,通常は表の形でまとめられます。この表のことを、コード表といいます.下の図は,ASCII7ビットコード表と言われるものです.
\ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
0 | Null | DLE | 空白 | 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 |
ASCIIコード表では,文字情報を7桁の2進数(128通りのビットパタン)に対応づけています.これは,このコード表では2の7乗個,即ち128個の文字情報を区別し,表すことができるということを意味しています.ASCIIコードは日本語には対応していませんが,例えばアルファベットに加えて半角カタカナを扱おうとすると,7ビットでは足りません.JIS X 0201と呼ばれるコード系では,文字情報を8ビットのビットパタン(256通りのビットパタン)に対応づけることによって,アルファベットに加えて半角カタカナをも扱えるようになっています.
文字のコード化は,文字記号の少ないアルファベット圏では比較的容易ですが,漢字圏のように多数の文字があるところでは様々な問題があり,困難です.どの文字を採用するかを考えることも大変ですし,採用した文字と数値(ビット列)の対応づけも面倒な作業になります.加えて,後で文字を追加するときには,先に作られたコード系といかに整合性を保つかといった多くの作業をこなさなければなりません.
コード表の読み方
図のASCII7ビットコード表とは,その名のとおり7ビット,すなわち128通りのビット列一つ一つに記号を割り当てたものです.上側の0〜7の16進数は上位3ビット,左側の0〜Fの16進数は下位4ビットを表しています.表を見ると,例えば大文字のAは16進数では41,すなわち2進数では1000001というビット列に対応しています(16進数については後述).つまりこのコード系に基づいた場合,コンピュータにとって大文字のAは1000001というビット列として扱われます.
また,「CR」や「DEL」など,見慣れない文字列があります.これらは文字ではなく,コンピュータに特定の機能を実行させる役割が割り当てられた機能コードです.例えば,「CR(carriage return)」は,「このコードが来たら行をかえるのだぞ」(改行)という意味で使われています.
16進法
コンピュータは2進法によって様々な情報を扱います.情報を表すために使用されている0と1の配列のことをビット列といいます.これまで見てきたように,コード表においても,文字記号はビット列に対応づけられています.しかし,2進数で情報を表す場合,2進法では2の累乗で桁上がりを起こすために,情報量が増えると桁数もそれにつれて増えていきます.桁数が増えすぎると読みにくいため,2進数のビット列を4桁ごとに区切って表現することがあります.このとき,4桁の2進数を16進数で表します.
10進数 | 2進数 | 16進数 |
---|---|---|
0 | 0000 | 0 |
1 | 0001 | 1 |
2 | 0010 | 2 |
3 | 0011 | 3 |
4 | 0100 | 4 |
5 | 0101 | 5 |
6 | 0110 | 6 |
7 | 0111 | 7 |
8 | 1000 | 8 |
9 | 1001 | 9 |
10 | 1010 | A |
11 | 1011 | B |
12 | 1100 | C |
13 | 1101 | D |
14 | 1110 | E |
15 | 1111 | F |
16進数は16とその累乗で桁上がりを起こしますが,0から9までの10個の数だけでは不足なので,これに加えてA〜Fの6個の英大文字を使って数を表しています.そのため,10進法の10は16進法のA,10進法の15は16進法のFとなります.16進数の位取りの考え方は次のようになっています.
・16進法における位取りの考え方2進数と16進数の変換
2進法と16進法の相互変換は次のように簡単に行うことができます.たとえば,2進法の10011100110を16進数にする場合,以下の手順で変換します.
- 与えられた2進数を,下の位から順に4つずつのグループに分ける.→100 1110 0110
- 各グループを,対応表を基に16進数で置き換える.100→4 1110→E 0110→6
- 答え4E6
16進数から2進数に変換するには,逆の操作を行います.
マルチバイトコード系
高機能なコンピュータが低価格で手に入るようになり,ますますコンピュータが日常的になってくると,日本語処理でも本格的な漢字の利用が始まりました.アルファベットをはじめとする文字記号を表すためには7ビットが,アルファベットに加えて半角カタカナを扱えるためには8ビットが必要でした.漢字の文字数は数万にのぼるため,現状ではその一部のコード化が行われているにすぎませんが,それでも実用的に漢字を扱うには8ビット=1バイト(256パタン)ではとても足りません.そこで,漢字のコード化は16ビット=2バイト(65536パタン)で処理されることになりました.漢字を取り扱うコード系としては,iso-2022-jp,SHIFT_JIS,EUC-JPの3種類がよく使われています.
文字化け
次のリンクを開いてみましょう.
→文字化けページこのように,正しく文字が表示されないことを文字化けと言います.皆さんも,Webページを閲覧しようとしたら文字化けしていて読めなかった,という経験があるかもしれません.
文字化けは,漢字を扱うためのコード系が複数混在していることによって生じます.通常は,ブラウザの設定で文字コードを適切に設定することによって直すことができます(→1.3 ブラウザの使い方).
● 練習問題
- 先ほどの文字化けページを開き,ブラウザの設定を変えることによって文字化けを直しなさい.
- SHIFT_JISコードに従って日本語で書かれたテキストファイルがあります.ファイルの容量は12キロバイトです.このファイルに書かれた文字数はおよそ何文字程度でしょうか.計算してみましょう.
- ASCIIコード表では,アルファベットの「P」はどのようなビット列(7桁の2進数)に対応づけられているでしょうか.
- 機能コード,記号,アルファベット,カタカナ合計191文字を扱うためには何ビットの情報量が必要となるでしょうか.
HTMLの文字コード指定について
文字化けを起こさないために,CNSでHTMLファイルの編集を行う際には,head要素の中に以下の一行を挿入します.
<meta http-equiv="Content-Type"content="text/html; charset=ISO-2022-JP" >