[5]漢字コード
目次へ. 前頁へ.
次頁へ.
次に話を日本のことに移して漢字コードのことを考えてみる.
- 漢字コード
具体的に漢字のコードを見てみる.
「葷」の漢字コードは
SJIS :E4D6, JIS: 6858, 区点:72,56, EUC: E8D8
となっている.SJIS は Shift JIS コード,JIS は JIS コード,区点は区点コード,
EUC は EUC コードである.「葷」はクンと読む.
4つも表があるのは気に入らないがここでは気にしないことにしよう.
それぞれのコードの説明はこの後で行う.
Shift JIS の場合,256×256 の表の E4列D6行を見れば「葷」の漢字がある.
前に,この表をみんなに配っておけば一件落着,と書いたが,
この表はパソコンを買ったときに配布されている.Macintosh の場合,
「Macintosh 日本語入力操作ガイド」にこの表がある.
ただ,256×256 の表を本にするのは大変なので変形して書いている
(94×94 の表は折り込みで入っていることもある).
でも頭の中では 256×256 の表があると思った方がわかりやすい.
もちろん,漢字は 7,000個くらいなので表の一部分を占めているにすぎないが.
- 区点コード
区点コードは 1〜94 までの「区」と 1〜94 までの「点」をコンマで区切って表す.
これらは10進数である.もちろん,コンマで区切らない場合もあるし,
スラッシュで区切る場合もある.「点」を 0〜94 までとして例えば,
区点コード 01,00 を考えてもよいのだが「点」が 00 になるところは省いている(漢字を配置しない).
つまり 94×94 の表の中に漢字を配置すると思ってよい.
区点コードで実際に文字を表示してみよう.EGBRIDGE 9.0 の場合であるが,
鳥の羽のところを押して「操作パレット表示」を選ぶ.
「あ」のところを押すと「コード入力」というのがある.
ここで「72,56」と入力する.「葷」が表示される.
JIS コードの「6858」や Shift JIS コードの「E4D6」を入力しても「葷」が表示される.
- JIS コード
区点コードは日本人にとって理解しやすい.整然とした漢字の表になっているからである.
でもこれはコンピュータ向きではない.それで 256×256 の表の中に埋めるのであった.
これが JISコードである.JIS コードは次のように漢字を配置する.
256×256 の表の第21列から第7E列までを「区」とする.第21行から第7E行までを「点」とする.
ここに区点コードの表をそっくり入れる.すなわち,
JIS コードは
区:第 21 列から第 7E 列
点:第 21 行から第 7E 行
である.
第21列から第7E列までは 7E-20=5E(16進数)=94(10進数) 個あり,第21行から第7E行までも94個ある.つまり,JIS コードは 256×256 の表の左上の正方形領域を占めていることになる.
なぜ,00列や00行から始めずに21列や21行から始めているのかであるが,
2バイト文字をアメリカ人が読むとき,1バイト文字づつ読む.
ASCII コードの 0列,1列には制御コードが入っていた.
1バイト文字づつ読むと制御コードを読むことになるので,これを避けた.
また,ASCII コードの 20 は space キー,7F は DELキーであったが,
これらを除くと列や行は 21列,21行から始めて7E 列,7E 行までとなる.
区点コードの 94 はむしろこの制限から来ている.
- 区点コードからJIS コードへの変換
JIS コードは区点コードをそっくり256×256 の表の中に入れたものだから,
区点コードを JIS コードに直す式は簡単に出せる.16進数で平行移動すればよい.
例えば,「葷」の区点コード 72,56 からJIS コード 6858 を計算してみよう.区72と点56を16進数に直す.48 と 38 である.それぞれに 20 を足す(16進数の足し算).68 と 58である.つまり,68列58行だから,6858 である.Cf.[11].
逆に JIS コードから区点コードも計算できる.
このように区点コードとJIS コードはまったく同じものであることがわかる.
- JIS 8bit コード
前にも説明したが,実は JIS コードにはもう1つのコードがある.
ASCII コード 16×16 の表の左半分をほとんどそのままにして,右半分に半角カナなどを入れたものである.Cf.JIS 8bit code.
つまり,JIS コードは 256×256 の表と16×16 の表の2本立てになっている.
なぜ,16×16 の表が必要かを説明する.ここに米国から送られてきたファイルがあるとする.
そこには abc など日本人になじみの深い文字がある.
しかし,256×256 の表でこれを読むことはできない.エラーになる.それで,
ASCII 7bit code はそのまま読んでしまおう,ということになった.日本人は巧みなものである.
外国のファイル自身を自分の国のファイルの中に入れてしまうのだから.逆はできない.
日本語を ASCII コードで読むともちろん文字化けする.日本人は少しの文字化けでも大騒ぎ?するが,
外国人にとってはすべての日本語が文字化けする.日本人よ,騒ぐなってところか.
まあ,こんな訳で 16×16 の表が必要なのである.
2本立てのコード表をどう使い分けるかであるが,これにはエスケープシークエンスを用いる.
エスケープシークエンスについては [9] を参照のこと.
- Shift JIS コード
「疎」という漢字のJIS コードは 4142 である.この漢字はエスケープシークエンスを使わなければ, ASCII コードの 41の文字「A」と42 の文字「B」を用いて「AB」と表示される.このように,JIS コードは ASCII コードのよく使われる文字とダブル.
これを解消するために JIS コードをずらしたものを考えた.
これが Shift JIS コードである.Microsoft 社やアスキーが考え出したもので,
Mac や Windows など,普通の日本語パソコンはすべて Shift JIS になっている.
Shift JIS の特徴はエスケープシークエンスを使わない(少しは使うかもしれない)ことや ASCII コードのほとんど使われない領域を使用することにある.つまり,空き家を探して入ったというところか.そのために Shift JIS の領域は飛び飛びでわかりにくいものになっている.
Shift JIS は 256×256 の表で,次のような領域に漢字を配置する.
列: 81 列から 9F 列までと E0 列から EF 列まで,
行: 40 行から FC 行まで.途中,7F 行を除く,
となっている.これは何かの本を見たのではなく,Shift JIS コード表を見て自分で探してみた.
まず行の方は何個あるか計算してみる.途中1個抜けているので,
FC-40=BC(16進数)=188(10進数) ,
188個ある.これはちょうど94個の2倍である.列の方は
9F-81+1=1F(16進数)=31(10進数),
EF-E0+1=10(16進数)=16(10進数)
の両方で 47個ある.94個の半分である.きれいにできている.で,本を見なくても
これは間違っていないと信じられる.
つまり,JIS コードの 94×94 の正方形を縦に引き伸ばして長方形にしたと思えばよい.それを平行移動して列のいくつかをある場所でずらしたり,行の1行を抜いたり,ちょっといじっているだけだ.これは一定の規則で行っているのだから,JIS コードとShift JIS コードの変換式を出すことができる.これは自分で求めてみた.興味のある人は[11]を参照のこと.
- Shift JIS の領域の選び方
JIS 8bit code や ASCII 8bit code Latin-1 の表の8列,9列は未定義になっている.
従って,81 列から 9F 列を使う.80 列を除いているのはなぜだか知らない.
まだ足りないので,JIS 8bit code で使っていない E 列を使う.
行を 40 行から始めているのは ASCII 7bit code のアルファベットから始めたかったからだろう.
また,7F には Delete キーが入っている.それで,7F 行を除いている.わかりにくいよね,まったく.
まあ,Shift JIS は空き家を探して入っているのだから仕方がないか.
- Shift JIS の読み込み方
Shift JIS も JIS 8bit コードとの2本立てになっている.
それらをどう読んでいくかであるが,
Shift JIS はエスケープシークエンスを使わずに1バイト文字づつ見ていく.
例えば,61 B1 E4 D6 という 16×16 の表の文字列(16進数)が入って来たとする.
それぞれのコードが 81 から 9F までと E0 から EF
までに入ってなければこれは1バイト文字と解釈して JIS 8bit コードをそのまま出す.
すなわち,61 は a を表すから a を表示する,B1 は半角カナの「ア」を表示する.
E4 は E0 から EFの間に入っているので,
これは2バイト文字の頭だと解釈してその次のコードを見る.
そして,E4D6 の漢字「葷」を表示する.
すなわち,61 B1 E4 D6 を Shift JIS で読めば「aア葷」という日本語になる.
このために漢字を配置する列のところを JIS 8bit code の空き家にしている.
ASCII 8bit コードを Shift JIS で読んだ場合を考える.このとき,
ASCII 7bit code はそのまま出せる.ASCII 8bit code (16×16の右半分)は半角カナになる.
これで半角カナの文字化けの理由が理解できるだろう.
もっと詳しい文字化けの説明や体験は次節で行う.
- EUCコード
少し疲れてきたが,もうひとつ漢字のコードがある.
EUCコード(Extended UNIX Code)である.
EUC は UNIX で使われる漢字のコード体系で国際規格である.
Code とコードがダブルけれど EUCコードと呼ぶことにする.
また,正確には日本語EUCコードと呼ばなければならないが,ここでは単に EUCコードと呼ぶ.
EUCコードには4枚の表があると思ってよい.
セット0 … JIS 8bit コード表の左半分(ASCII 7bit 表),1バイト.
セット1 … JIS コードの漢字をずらしたもの,2バイト.
セット2 … 8E+JIS 8bit コード表,2バイト.
セット3 … 8F+JIS コードの補助漢字,3バイト.
セット0は ASCII 7bit 表と同じものである.
セット1には漢字を配置する.256×256 の表で JISコードの列と行を16進数で
80 づつ平行移動する.JISコードの列は 21列から7E列までであった.行も同様.
従って,EUCコードは
A1列からFE列まで
A1行からFE行まで
となる.ずらしているので JISコードのような重複(abcなどよく使う文字との重複)は避けられる.
JISコードからEUCコードを出すのは簡単である.列と行に 80(16進数)を足せばよい.
例.「押」の JIS コードは「3221」である.それぞれに80を足せばEUCコードは「B2A1」となる.
セット2では最初の1バイト目はいつも8E列しか考えない.2バイト目(256×256の行の方)
に JIS 8bit コード表を入れていく.例えば,EUCコード 8E61 は何か.61 は a のことだったから,
a である.8EB1 は何か.B1 は半角のアのことだったから,半角のア である.8E を読み飛ばせば
JIS 8bit コード表そのものである.つまり,EUC コードは日本語の文字の2本立てを止めて
256×256の表1本にしている.ASCII 7bit 表だけは別途に考えているというところか.
セット3は補助漢字だからここでは考えない.
ここまで見てくると Shift JIS と EUC の間の文字化けの原因も想像がつく.
8EB2 は Shift JIS では漢字を表している.一方は半角カナだと言っている.
文字化けするのが当たり前か.具体的な文字化けの体験はこの後にする.
目次へ. 次頁へ.