矢沢 久雄
今回は,最低限知っておきたい文字コードの種類の中で,漢字を表せるものを紹介します。それは,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バイト文字を区切る |
一昔前のパソコンでは,ディスプレイやプリンタに漢字を表示するために,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コード |
●機種依存文字は文字化けする
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は,数字,英字,漢字などの文字の種類にかかわらず,基本的に1文字を2バイトで表すものです。ただし,現在では2バイトに文字が収まりきれなくなったため,この原則はくずれています。コンピュータのメモリー上でUnicodeを処理する場合は,2バイト単位で文字を処理すればよいのです。ところが,文書ファイルをUnicodeで保存する場合には,ASCIIで規定された英数記号なら1文字1バイト,漢字など英語以外の文字なら1文字2バイト以上で表すUTF-8という形式が主流になっています(1文字を基本的に2バイトで記録する方式は,UTF-16と呼ばれます)。
![]() |
図4●UTF-16形式で保存されたUnicode(一例) |
![]() |
図5●UTF-8形式で保存されたUnicode |
●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コードと同じ |
主にWindowsをお使いの皆さんは,EUCが存在することだけを知っておいてください。Internet ExplorerやOutlook Expressなどのインターネット関連アプリケーションは,EUCに対応しています。
今回の講座で,文字コードの元祖が何と言ってもASCIIであること,WindowsやMac OSはシフトJISコードからUnicodeへの転換期にあること,そしてLinuxなどのUnix系OSでは独自のEUCが使われていることをご理解いただけたでしょう。これで,Windowsユーザーとして,文字コードの種類に関する知識は,バッチリです。あらゆるコンピュータでUnicodeだけが使われるようになるのが理想的なことですが,しばらくは無理でしょう。複数の文字コードが使われている現状のままでも,文字コードの種類に注意さえしていれば,大きな問題は生じないはずです。
次回は,プログラムで文字コードを処理するテクニックを説明します。お楽しみに!