矢沢 久雄

 今回は,最低限知っておきたい文字コードの種類の中で,漢字を表せるものを紹介します。それは,JISコード,シフトJISコード,Unicode,EUCの4つです。PCやUNIXマシンで皆さんが現在,何という文字コードを使って漢字を表していて,それが今後どのように変わっていくかを確認してください。

●JISコード

 前回の講座で説明した7ビットのASCIIを使って表せる文字数は,最大で128種類です。8ビットのJIS X 0201を使って表せる文字数は,最大で256種類です。7ビットや8ビットのように少ないビット数で1文字を表したのでは,数千種類にも及ぶ漢字を網羅することはできませんね。そこで,JIS(Japan Industrial Standards:日本工業規格)によって2バイト=16ビットを使った文字コード体系が考案されました。

 2バイトあれば,最大で216=65536種類の文字を表せます。これだけあれば,漢字を表すのに十分すぎるほどです。もっとも一般的な規格であるJIS X 0208:1997では,日常的によく使われる数字,英字,ひらがな,カタカナ,漢字,記号など6879文字が規定されています。しかし,このままではASCIIやJIS X 0201と混在させることができません。

 JISコード(ISO-2022-JP)は,1つの文書ファイルの中に,JIS X 0208がASCIIやJIS X 0201と共存できる仕組みを取り入れたものです。その仕組みの基本となっているのが「エスケープ・シーケンス」と呼ばれる制御コードで,文字コードが変化する位置を示すというものです。

図1●エスケープ・シーケンスで1バイト文字と2バイト文字を区切る
 「123漢字ABC」という文字列を使って,具体例を示しましょう。この文字列をJISコードで表現すると,図1[拡大表示]のようになります。1BHではじまる3文字がエスケープ・シーケンスです。1BH,24H,42Hは,それ以降にJIS X 0208で表された文字コードが格納されていることを表します。1BH,28H,42Hは,それ以降にASCIIで表された文字コードが格納されていることを表します。1BHのことを「エスケープ文字」と呼びます。エスケープ文字から連続した制御コードなので,エスケープ・シーケンス(sequence=連続)と呼ぶのです。JISコードに対応したアプリケーションは,エスケープ・シーケンスを確認することで,文字コードを適切に判別できます。

 一昔前のパソコンでは,ディスプレイやプリンタに漢字を表示するために,JISコードが使われていました。ハードウエアがJISコード対応になっていたのです。現在でも,直接ハードウエアに文字コードを送るときには,JISコードが使われることがあります。JISコード以外のOSは,ハードウエアとの入出力の際に,文字コードを変換しています。

●シフトJISコード

 コンピュータの世界は,常に進歩を続けています。既存の規格に問題があれば,それを改善するための新しい規格が考案されます。マイクロソフトは,パソコン用のOSであるMS-DOSを日本語化するにあたり,エスケープ・シーケンスを使ったコード体系では,処理が面倒だと考えました。そこでマイクロソフトは,MS-DOSの文字コードとして,独自に開発したシフトJISを採用することにしたのです。

 シフトJISでは,エスケープ・シーケンスを使うことなく,1バイト文字と2バイト文字の共存を可能としています。その仕組みは,2バイト文字の先頭バイトに,1バイト文字(ASCIIやJIS X 0201)で使われていない値を使うというものです。この連載の第2回で示したJIS X 0201の文字コード表をもう一度見てください。80H~9FHとE0H~FFHの領域には,文字が割り当てられていません。マイクロソフトは,JIS X 0208で規定された文字の集合を,それらの文字コードの先頭バイトが80H~9FHとE0H~FFHとなるようずらす(シフトする)形で,シフトJISコードを規定したのです。

図2●エスケープ・シーケンスを不要としたシフトJISコード
 例えば「123漢字ABC」という文字列をシフトJISコードで表現すると,図2[拡大表示]のようになります。左端から順に文字コードの値を見ていきましょう。31H,32H,33Hは,1バイト文字の1,2,3であることがわかります。次の8AHは,1バイト文字では規定されていない文字コードではないので,次の文字コードと合わせて8ABFHというシフトJISコードの2バイト文字であることが判別できます。実に巧妙な手法ですね!

●機種依存文字は文字化けする

 Webページやメールの中に,などの文字を使うと文字化けすることをご存知でしょうか? これらは,「機種依存文字」と呼ばれるものです。機種依存文字とは,同じ文字コード体系であっても,それを表示する機種やOSによって,部分的に異なる文字が割り当たられたもののことです。「機種依存文字が存在すること自体ナンセンスだ!」と思われるかもしれませんが,歴史的な経緯によって生まれてしまったものなので仕方ありません。

 DOS/V(AT互換機)が普及する前,日本ではNECのPC-9801や,IBMのPS/55など,何種類もの違った機種が出回っていました。これらのPCは,JIS X 0208のためのフォントを記録したキャラクタ・ジェネレータ(「漢字ROM」とも呼ばれます)を内蔵していました。PC-9801とPS/55のキャラクタジェネレータに記録された数字,英字,漢字,ひらがな,カタカナなどは,基本的に同じコードに同じ文字が割り当てられていました。ところが,ユーザーの便宜を考えて,のような特殊な文字が,それぞれの機種で独自に追加されていたのです。これが,すなわち機種依存文字です。

 PC-9801やPS/55では,OSとしてMS-DOSを採用していました。PC-9801用のMS-DOSは,PC-9801の機種依存文字に対応したシフトJISコードを使っていました。PS/55シリーズのMS-DOSは,PS/55の機種依存文字に対応したシフトJISコードを使っていました。当然のことですが,機種依存文字を含んだ文書ファイルをPC-9810とPS/55で交換すると,部分的な文字化けが発生してしまいます。

 「機種ごとに若干異なる機種依存文字があるのは,よろしくない」ということで,Windowsでは,PC-9801の機種依存文字とPS/55の機種依存文字を統合したシフトJISコードが使われています。めでたし,めでたし,です。ところが,問題は解決していませんでした。シフトJISコードを採用しているMac OSでは,Windowsとは異なる機種依存文字が規定されてしまったからです。したがって,依然としてシフトJISコードの機種依存文字の問題は残っており,Windowsで作ったWebページをMac OSで表示すると部分的に文字化けする可能性があります。これは,シフトJISコードが,ISOやJISのような公的機関ではなく,メーカーによって独自に規定されたものだからです。メーカーごとに自由が許されてしまったわけです。

 この問題を回避するためには,Webページやメールでは,機種依存文字を使わないように注意するしかありません。誌面の都合で,機種依存文字の一覧を紹介することはできませんが,のような特殊な記号が機種依存文字だと考えてください(この講座の最終回で,機種依存文字を判定するフリーウエアを紹介します)。

●Unicode

 世の中に存在する文字コードは,ASCII,JIS X 0201,JISコード,シフトJISコードだけではありません。中国語,韓国語,アラビア語などを表す文字コードもあります。世界中の文字コードを統一できたら,こんな素晴らしいことないでしょう。文字化けなど気にしないで,自由自在に文書データを交換できるからです。そこで,マイクロソフト,IBM,アップルなどのメーカーが,2バイト(16ビット)で世界中の文字を表現できる新しい文字コードであるUnicodeを開発しました。UnicodeのUniとは,unificationすなわち「統一」という意味です。現在では,Unicodeを基にしたISO/IEC 1064bという規格が作られ,国際的にも認められています。

図3●シフトJISコードとUnicodeに対応したWindowsのメモ帳
 今後は,世界中のコンピュータでUnicodeが採用されるようになると思われますが,既存の文字コードによる資産を捨て去ることはできません。初期のWindowsでは,シフトJISコードだけが採用されていましたが,最新のWindows 2000やWindows Meとなっても,シフトJISコードを完全に捨てられず,シフトJISコードとUnicodeの共存環境となっています。Windows用のアプリケーションには,シフトJISコードだけに対応したものと,シフトJISとUnicodeの両方に対応したものがあります。例えば,Windows 2000に添付されたテキスト・エディタである「メモ帳」では,文書ファイルの保存形式として,シフトJIS(ANSIと表されている)またはUnicodeが選択できるようになっています(図3[拡大表示])。Mac OSも,徐々にシフトJISからUnicodeに転換中です。現在は,シフトJISコードからUnicodeへの転換期にあるということを認識してください。

 Unicodeは,数字,英字,漢字などの文字の種類にかかわらず,基本的に1文字を2バイトで表すものです。ただし,現在では2バイトに文字が収まりきれなくなったため,この原則はくずれています。コンピュータのメモリー上でUnicodeを処理する場合は,2バイト単位で文字を処理すればよいのです。ところが,文書ファイルをUnicodeで保存する場合には,ASCIIで規定された英数記号なら1文字1バイト,漢字など英語以外の文字なら1文字2バイト以上で表すUTF-8という形式が主流になっています(1文字を基本的に2バイトで記録する方式は,UTF-16と呼ばれます)。

図4●UTF-16形式で保存されたUnicode(一例)
 UTF-8は,インターネットにおける文書ファイルの転送効率を上げることを目的としたものです。世界中の人たちが様々な言語でインターネットを使っているとは言っても,その主流は,何と言っても英語です。HTMLのタグや,メールのヘッダ情報などは,英語で記述されています。

図5●UTF-8形式で保存されたUnicode
 「123漢字ABC」という文字列をUTF-16及びUTF-8で表現すると,図4[拡大表示]および図5[拡大表示]のようになります。この場合には,確かにUTF-8の方が短いデータとなっています。ただし,日本語を多く含んだ文書ファイルの場合は,UTF-16の方が短いデータとなります。

●EUC

 インターネット時代となり,世界中の様々なコンピュータが相互に接続され,文書データが交換されるようになりました。Webページもメールも文書データの一種です。ここまでに取り上げたWindowsとMac OS以外に,LinuxなどのUNIX系OSをはじめさまざまな種類のOS採用しているコンピュータが数多く存在しています。UNIXでも,基本となる文字コードはASCIIです。ただし,漢字を表すためには,UNIX独自の規格であるEUC(Extended Unix Code)を採用しています。EUCで日本語(JIS X 0208など)を表したものを日本語EUC(EUC-JP)と言います(以下ではEUCと略します)。

図6●EUCの仕組みはシフトJISコードと同じ
 EUCは,JIS X 0208で規定されている文字を,ASCIIで規定されている文字と重ならないようにシフトしたものです。これは,シフトJISコードと同じ仕組みですが,シフトの方法が異なります。例えば,「123漢字ABC」という文字列をEUCで表現すると,図6[拡大表示]のようになります。ASCIIは,そのまま1バイトで表され,漢字が2バイトで表されていますが,漢字を表す文字コードの値がシフトJISと異なることが分かるでしょう。

 主にWindowsをお使いの皆さんは,EUCが存在することだけを知っておいてください。Internet ExplorerやOutlook Expressなどのインターネット関連アプリケーションは,EUCに対応しています。

 今回の講座で,文字コードの元祖が何と言ってもASCIIであること,WindowsやMac OSはシフトJISコードからUnicodeへの転換期にあること,そしてLinuxなどのUnix系OSでは独自のEUCが使われていることをご理解いただけたでしょう。これで,Windowsユーザーとして,文字コードの種類に関する知識は,バッチリです。あらゆるコンピュータでUnicodeだけが使われるようになるのが理想的なことですが,しばらくは無理でしょう。複数の文字コードが使われている現状のままでも,文字コードの種類に注意さえしていれば,大きな問題は生じないはずです。

 次回は,プログラムで文字コードを処理するテクニックを説明します。お楽しみに!

(→「第4回 プログラマにとっての文字コード」を読む)