エンジニア、クリエイターのための派遣求人情報ラボラトリー
キャリア・ラボ IT TOP > IT Columns > 文字コードで世界に出る~さらば!文字化け~ > 第11回
IT Columns 【文字コードで世界に出る~さらば!文字化け~】
「シフトJIS」って、何のためにあるの?
11

 ソフトウェアの開発やWebページの作成などに携わっている方であれば、「シフトJISコード」という文字コードの名称を聞いたことがあるかと思います。
  その名の通り、本連載でこれまでに紹介してきた「JIS漢字」を「シフトさせた(ずらした)」文字コードですが、なぜ、わざわざそんな面倒くさい文字コードが使われているのでしょうか。今回は、この「シフトJISコード」が開発された理由を探ってみましょう。

「シフトJIS」はマイクロソフト社など民間企業が開発

 さて、郵政の民営化に始まり、何でもかんでも民営化するのが最近のちょっとしたブームになって
いる感じがしますが、「JIS漢字」が公けが定めた公的な文字コードであるのに対して、「シフトJISコード」
)マイクロソフト社などの民間企業が中心となって開発した私的な文字コードです。

 その特長は
 (1)収録する文字は「JIS漢字」に準拠する
 (2)ただし、ひらがなや漢字などの個々の2バイト文字の文字コードは「JIS漢字」のままではなく、
   それを一定のルールに従ってシフトさせたものとする
というものです。

 (1)の収録文字が「JIS漢字」に準拠しているのは、JIS漢字が情報交換のために定められた公けの
文字コードであることから、きわめて当然のこととかと思います。ただし、「シフトJISコード」では
「JIS漢字」が定める文字とは別に「ユーザ領域」を定めて、メーカーやユーザなどが自由に文字を定義
できるようにしています。いわゆる「外字」ですが、これがもたらした「混乱」については、次回に触れたい
と思います。

 問題は(2)の個々の文字の文字コードをシフトさせた点です。 「シフト」の話に入る前に、まずは
「JIS漢字」がどういうように配置されていて、1バイトの英数字と2バイトのひらがなや漢字などをどう
やって混在させているのか、確認しておきましょう。

「エスケープ・シーケンス」で1バイトと2バイトを区別

 「JIS漢字」では、1バイトの英数字と2バイトのひらがなや漢字などが同じコード領域に収録され
ています(図1)。

「JIS漢字」のコード領域 「JIS漢字」のコード領域
【図1】
「JIS漢字」のコード領域

 1バイトの英数字が収録されているコード領域と2バイトのひらがなや漢字が収録されているコード
領域が重なっているというのは、具体的にはどういうことなのでしょうか?

 下の図2はMS-IMEの「IMEパッド-文字一覧」を呼び出して、1バイトの「A」字の文字コードを確認
してみたところです。

英字の「A」のコードは 英字の「A」のコードは
【図2】
英字の「A」のコードは

 マウスポインタを合わせると、「A」字の文字コードが「0x0041」すなわち「41」と表示されます。
先頭の「0x」はこの値が16進数であることをあらわしています。
 では、もう1つ、2バイト文字の例として「漢」の字の文字コードを確認してみましょう。

漢字の「漢」のコードは 漢字の「漢」のコードは
【図3】
漢字の「漢」のコードは

 図3の通り、「漢」字の文字コード(JISコード)は「3441」となっています。「JIS漢字」では2バイトで
1文字をあらわす仕組みとなっていますので、「漢」字は「34」と「41」の2バイトで表現されるワケです。

 1バイトの「A」字の文字コードが「41」で、2バイトの「漢」字の文字コードが「3441」ということは、何
バイトかの並びがあった時、その中に「41」という1バイトがあっても、それが1バイトの「A」をあらわ
しているのか、それとも、2バイトの「漢」の一部なのか、判断できないことを意味します。
 そこで、「JIS漢字」では「エスケープ・シーケンス」と呼ばれる特殊な方法を用いて、1バイト文字と
2バイト文字を区別するようにしています。「エスケープ・シーケンス」などと聞くと、何やら難しく聞こえ
ますが、要は文字列の途中に「ここからは2バイト文字だよ」あるいは「ここからは1バイト文字だよ」と
指示する制御文字を挿入することによって、1バイト文字と2バイト文字を区別する仕組みです。

 例えば、1バイトの英字と2バイトの漢字が混じった「ABC漢字」という文字列の場合は、下図の
ようになります(図4)。

「JIS漢字」で「ABC漢字」を表現すると 「JIS漢字」で「ABC漢字」を表現すると
【図4】
「JIS漢字」で「ABC漢字」を表現すると

「シフトJISコード」は1バイト文字と2バイト文字の混在が得意

 「エスケープ・シーケンス」には、元々、7バイトだった文字列(英字3文字で3バイト+漢字2文字で
4バイト)が13バイトにまで膨れ上がるという欠点はありますが、単純な仕組みで、きちんと1バイト
文字と2バイト文字を区別できる、なかなか巧妙な方法でした。

 しかし、コンピュータ内部で漢字などの2バイト文字を扱う場合にこの仕組みを使おうとすると、無理
が出てきます。
 例えば、ワープロソフトで2バイト文字を検索したり、行端で改行したりするケースを考えると、絶えず
前方にある「エスケープ・シーケンス」にさかのぼって、現在のバイトの並びが1バイト文字なのか、
それとも2バイト文字の一部なのかを把握しておかないといけません。
 本来、文字コードはコンピュータ間で円滑に「情報交換」を行うために定められたものでした。
メディアを介すにしろ、通信を介すにしろ、ファイル単位で情報の交換を行うのであれば、必ず、先頭
から順番に送りますので、1バイト文字と2バイト文字の区切りの位置に「エスケープ・シーケンス」を
挿入するという方法でも何ら支障はありません。しかし、コンピュータ内部での処理ではランダムに
データにアクセスすることが多いため、「エスケープ・シーケンス」という方法は適していないのです。

 そこで、Windowsの前身にあたるMS-DOS開発時にマイクロソフト社などによって考え出されたのが
「JIS漢字のコード領域をごっそり1バイト文字の領域と重ならないコード領域にズラしてしまえ」という
方法、すなわち「シフトJISコード」でした(図5)。

「シフトJISコード」のコード領域 「シフトJISコード」のコード領域
【図5】
「シフトJISコード」のコード領域

 実際には、日本では英数字だけでなく、すでに1バイトのカタカナを扱う文字コード(JIS C 6220)
も定められていましたので、英数字だけでなく、半角カタカナのコード領域とも重ならない領域に
ズラす必要がありました。
 そのため、図5のように、何とか空いている領域を見つけ出して、それを組み合わせて、「JIS漢字」
で規定されている文字をすべて収録する仕組みとなっています。

 これであれば、1バイト文字のコード領域と2バイト文字のコード領域はまったく重なりませんので、
1バイト文字と2バイト文字を混在させる場合に「エスケープ・シーケンス」を挟むといった特殊な処理
を行う必要がありません。

 例えば、先ほど「エスケープ・シーケンス」の例としてあげた「ABC漢字」という文字列を
「シフトJISコード」であらわすと、下図のようになります(図6)。

「シフトJISコード」で「ABC漢字」を表現すると 「シフトJISコード」で「ABC漢字」を表現すると
【図6】
「シフトJISコード」で
「ABC漢字」を表現すると

 無駄もなくなり、ひじょうにスッキリと表現できるようになりました。
 MS-DOSが誕生したのは今から20年以上も前のことです。当時のCPUの貧弱な処理能力を
考えると、日本語処理を広めるうえで「シフトJISコード」が果たした役割はけっして小さくなかった
だろうと思います。

ご意見・ご感想ありがとうございます。

「シフトJISがマイクロソフト社などによって開発された」という記載について「誤解」とする
ご指摘を戴いていますが、シフトJISコードはアスキー・マイクロソフトの山下氏(当時)が
中心となって開発したと理解しておりますため、この件に関しては訂正の必要性を感じて
いません。何卒、ご理解のほど、お願いいたします。

古川氏(元マイクロソフト社長)の以下コメント欄もご参照ください。
http://furukawablog.spaces.msn.com/Blog/cns!1pmWgsL289nm7Shn7cS0jHzA!2225.entry

清水哲郎さんから詳しい説明を聞きたい方は、メール本文に質問とメールアドレスと
お名前をご記入の上、こちらまでご連絡ください。

ページトップ
フジスタッフホールディングスグループのサイト
オフィス系人材サービスキャリア・ラボ 人材派遣 | 転職 | ITエンジニア | CAD派遣 | 新卒・第二新卒 | ワーキングマザー
ファクトリー系人材サービスジョブデパ 求人情報 | エンジニア
その他人材サービス:人材紹介 | 旅行 求人 | メンタルヘルス | キャリアサポート | 障害者支援
その他サービス:ネットショッピング | タイムレコーダー販売 | 広告デザイン | ITソリューション | 大型ビジョン放送 | 保険相談