19.5.4 JIS漢字

JISの漢字集合

仮名やアルファベット, 記号などならよいのですが, 日本で用いられている漢字は,一説には10万字以上の種類があるといいます. これらの漢字を全てビット列に割り当てることも難しければ, それらの文字を選び出すことも難しいといえます. 日本では1978年にJIS漢字コードと呼ばれる文字集合が定められました. これは JIS X 0208,あるいはJIS基本漢字と呼ばれます. 7,000字弱の漢字, アルファベット, 数字, 記号などあらゆる種類の日本で用いられる文字が取り込まれています. この文字集合は二つにわかれており, 一つを JIS 第一水準, もう一方を JIS 第二水準と呼びます.

この文字集合には区点コードとよばれるものが割り当てられています. これらの文字を94×94(=8,836)の表の中に割り当てて, 縦軸を「区」, 横軸を「点」として表現したものです. 例えば漢字の「区」は22区72点に対応します.

漢字の符号化

ただし, これがそのまま計算機で用いられる文字コードのビット列に対応するわけではありません. その変換作業を符号化といいますが, 符号化の方式が後述のシフトJISコードならば先ほどの漢字の「区」は 0x8BE6 になりますし, JISコードならば 0x3668 となります.

日本で漢字を表すのには, 2バイト(16ビット)用いています. 16ビットあれば最大で65,536種類の文字が表せますから, その意味では十分といえるでしょう. JISで定められた漢字をビット列に割り当てる主要な符号化方式は三通りあります.それがJISコードシフトJISコード日本語EUCです.詳しい符号化方法については上級項目で取り上げます.

文字化け

これらの文字コードのどれを用いればよいか, ということは大抵は考える必要がありません. ただし, 多くの場合では, インターネットで用いるコードはJISコードであり, UNIXでは日本語EUC,WindowsやMac OS XではシフトJISです.

しかし, 届いたメールやウェブページなどが意味不明な文字列となっていて読めない場合があります. もしかしたら, 作者が意味不明なことを書いたのかも知れませんが, そうでないとすればそれは文字化けという現象です. 送り手と受け取り手で, それがどのコードであるかの解釈が異なった時などで発生します.

advanced

日本語の三種類の符号化方法について詳しく見ていきましょう.

JISコード

いわゆる JISコードは, JISの文字集合の区点コードを2バイトの各バイトの0x21から0x7Eに割り当てたものです. 図の四角の部分にあたります. この領域は GL領域と呼ばれます.

jis_small.png

注意する点として, このコードでは第一バイト, 第二バイトとも先頭のビット(8ビット目)は0であるということです. 簡単にいえば, 図では左上の1/4の領域しか用いていないということです.

この方式では, 8ビット目を用いません.

しかし, ASCII(JISローマ字)の文字コードが使えないと, 実際に困ることになります. アメリカなどで用いられている ASCII も使えて, なおかつJISコードを使いたいという要望があるので, JISコードは ISO 2022 と呼ばれる複数の符号の共存方式を用います. 簡単に説明しますと, 「今はASCIIである」「今はJISコードである」という切替を行なうことを可能にしたものです. これは「文字コードが状態を持つ」といえます. この切替えには, エスケープシークエンスと呼ばれる特別な文字を用います. ESCというのは0x1Bの制御文字です.

以上の四種類の切替を可能とします. これをISO-2022-JPと呼びます. 78JISは1978年のJISであり, 83JISは1983年のJISです. ASCIIとJISローマ字の違いは些細なものですし, JISの二つの違いも些細なものですから事実上は二種類の切替のみを行ないます.

なお, 0x00から0x20を用いないのは, ASCII(JIS仮名)の制御文字と重なるためです. JIS文字をASCII(JIS仮名)だと思って読んでしまった時に間違って制御文字だと解釈してしまうと問題がおきてしまうためにそれを回避しています.

なお,ここで用いているエスケープシークエンスが通信などで欠落してしまったときには,典型的な文字化けが起きます.

シフトJISコード

シフトJISコードは, ウィンドウズやMacintoshで用いられている文字コードで, MS漢字コードとも呼ばれます. ISO-2022-JP を用いて複数のコードを共存させることなく, ASCIIと漢字を2バイトの中に押し込めます.

sjis_small.png

8ビットコードのJIS X 0201では, 使われていない領域があります. これは0x81〜0x9Fと0xE0〜0xEFにあたります. 第一バイトにそこが来た時のみ, 第二バイトを読みにいきます.

図の二つにわかれた領域に漢字をうまく割り当てているわけです. その際, JISの区点の 94×94 をずらして分割して割り当てるという手法をとっています. これが シフトJIS の名前の由来です.

変換を容易にするために, 空き領域を全て用いるのでなく, 幅は94の二倍の188となっており, 高さは二箇所を合わせて94の半分の47となっています.

これはコードの切替がないために非常に処理が楽になります. また, 事実上もっとも広く使われているコードといえるでしょう.

しかし, JISコードと違って8ビット目を用いているために, それを許さない電子メールなどの規格では本来は利用できません. また, 第二バイトで, 0x80〜0xA0の領域を用いているため, この部分を誤って制御文字だと解釈すると問題がおきます. また, 拡張性に乏しいという問題もあります.

日本語EUC

日本語EUCは UNIXの世界を中心に広く使われています. これもJISコードと同じく複数の文字コードを切替えますが, エスケープシークエンスを用いない方式を使っています.

euc_small.png

これもやはり ASCII との共存ができます. また, 今度は, JIS基本漢字はテーブルの左下に移動しました. これを GR領域と呼びます. さらに, 日本語EUCでは, JIS補助漢字と呼ばれる別の文字集合が使えます. これは1990年に定められたもので, 6,000文字程度の漢字が含まれます.

特徴としては, JISコードのようなエスケープシークエンスによる切替が不要で, なおかつ制御文字部分は制御文字以外では全く用いないというものがあります. ただし, シフトJISと同じく8ビット目を用いているという問題点があります.

これらの複数の文字コードは, どれもASCII(JISローマ字)との共存が可能となっていますが, ASCIIに含まれる文字は, どれもJIS漢字にも含まれます. 同じ文字が複数のビット列に符号化されているという問題がおきているわけです. いわゆる「半角文字」としてASCIIで表すことも可能であり, いわゆる「全角文字」としてJIS漢字で表すことも可能ということです.