ソフトウェア:データ編 その3 文字を表す | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
さて前章では数を表す方法を概観してみました。 しかしコンピューターの扱うデータは数だけではありません。文章もあれば画像もあるし、音もあります。これはどうやって表現するのでしょう? ともかく原則はすべてを数値に変換してしまうということなのですが・・・ 文字コード普通にコンピューターを使っていれば、一番利用するのは文章でしょう。この文章とはコンピューターの内部ではどのように表現されているのでしょうか? そのためには文章が文字で現わされていることに気づけば簡単です。つまり文字が数値で表されればいいのです。
コンピューターの内部で文字に対応する数値を文字コードと呼び、どのような文字がどのような数値に対応するかという規則がコード体系と呼ばれます。 当然ながらこの規則は数値と文字が1対1で対応してさえいれば、どんなルールでもかまいません。しかし一人一人が違う規則を使ったりしたら、他人の作った文章が読めないことになってしまいます。 よくブラウザーなどで文字がぐちゃぐちゃに化けていることがあると思いますが、これはそのサイトで使用していた文字コード体系が異なっているからに他なりません。 一番基本のコード体系:アスキーコード以下の表は最初に定められたコード体系で、7ビット(0〜127)の数値にアルファベットや数字を割り当てています。
制御記号ところで上のコード表を見ると、0〜31の場所にはなんだか変な物がいっぱい書いてありますね。例えば13番のコードが来たら画面にCRと表示されるのでしょうか? そういうわけではなく、これは制御コードと呼ばれる物です。制御コードとは、文字そのものを表すものではなく、文字の表示の仕方などを制御するためにあるコードです。 例えば文章を書いていたら必ず改行をしますね?ではコンピューターはここで改行しなさいということをどうやって知るのでしょうか? こういうときに制御コードが使われるのです。すなわち Now you die! God! という文章があったとすると内部的には以下のようになります。 上が文字、下がそれに対応するコードです(コードは16進数で書いています) N o w y o u d i e ! CR LF G o d ! 4E 6F 77 20 79 6F 75 20 64 69 65 21 0D 0A 47 6F 64 21 ↑ ↑ この二つが改行のための制御コードまあプログラムを作るのでもない限り、制御コードの一つ一つの意味を覚えている必要はとくにありません。 ところで、上の例で改行という操作に二つのコードがありますが、これはどうしてでしょう?そんなものは一つあれば十分だとは思いませんか?これには実は歴史的な訳があります。 昔はコンピューターにはディスプレイなんて付いていませんでした。結果の出力はテレタイプ(要するに遠隔操作のタイプライター)を使って行われました。タイプライターを使ったことがある人なら分かると思いますが、タイプライターで改行する際は、ヘッドを左に戻して、それから一段ドラムを回します。 すなわちCR(0D)というコードはヘッドを左に戻せという指令であり、LF(0A)というのはドラムを回せという命令なのです。 しかしながら現代のディスプレイに表示する場合などには、たかが改行に二つのコードを使うのは無駄だといえます。そこで環境によっては一つのコードで改行できるものもあります。例えばマッキントッシュの場合はCR(0D)だけ。UNIXの場合はLF(0A)だけが改行コードです。ウインドウズやMS−DOSの場合はCR(0D)+LF(0A)が改行です。 このため時々インターネットからテキストをダウンロードして見てみたら、なぜか行間が空いてしまったり、逆に改行されずにぐちゃっと表示されてしまう、などということが起こります。 それにしても、使う環境によってコードが違うのは不便だとは思いませんか?一体どういうことなのでしょう? その理由は単にMS-DOSを作った人、マッキントッシュを作った人、UNIXを作った人が自分のことしか考えていなかっただけのことです。もちろんこれらが作られた時代はまだインターネットは実験段階の小さなものでしかなく、異なった環境の間でデータをやりとりする必要もありませんでした。別段他の人のことを考えなくても全く問題なかったのです。こんなに急にインターネットが普及するなど誰も考えていませんでした。 先見の明がなかったといえばそれまでですが、当時の人を責めても仕方ありません。 コンピューターとつきあっていくと今後も非常にしばしばこのようなことが起こります。 たくさんあるコード体系改行コードの不統一ぐらいはまだかわいい問題です。改行が少々変になったところで、文章が読めなくなるわけではないからです。しかし文字も含めたコード体系そのものに互換性がなかったりしたらそれは大変なことになります。ところが実際にそういうことがもう起こっているのです。 上記のアスキーコードはほぼ世界中共通で使えます。そのためアスキーコードだけを使って書いていれば、ほとんどどのようなコンピューターでもその文章を読むことができます。しかし日本語を表示しようとしたら、それでは全然足りないのは明白でしょう。 というわけでもちろん日本語を表示するためのコード体系があるわけですが、それは現在使われているものだけでも以下のような種類があります。 ◆ANKコードこれは一番最初に作られた、アスキーコードを少し拡張して、0〜255までの間に半角のカナなどを含めたコードです。とりあえず日本語を表示できないことはないというだけで、もちろん漢字などは含まれていません。◆JISコードANKコードではあまりにもちゃちなので、日本語を表記するためのコードとして制定されたのがこのJISコードです。漢字の数は多いので、2バイト(0〜65535)の数値に様々な文字を割り当てています。これを使えば今皆さんが読んでいるようなまあちゃんとした日本語が表記できます。しかしここでちょっとした問題が起こりました。日本語と英文が混じった文書を取り扱うときにひどく困ったことが起こるのです。 例えば「渦」という漢字はJISコードで3132(16進数)です。ところが31というのはアスキーコードの「1」、32というのは「2」です。コンピューターは3132というデータが来たとき、「渦」と表示するのか「12」と表示するのか区別がつかないのです。 もちろんアスキーコードを使うのをやめて、例えば「1」は0031とする、と決めてしまえばいいのですが、その当時はメモリーもディスクもたいへん高価でした。アルファベットを表示するのに2バイトも使うなんてとてもできませんでした。 そこで1バイトのアルファベットと2バイトの日本語文字を混在できるようにする仕掛けが考えられました。簡単にいえば、ここから日本語の文字が始まるという制御コード(1B 24 42)と、ここで日本語の文字が終わるという制御コード(1B 28 42)を作ったのでした。 こうすれば英文と日本文が混在していても大丈夫なのは分かるでしょう。 ◆シフトJISコードしかし漢字が始まるところと終わるところにいちいち制御コードを挟むのは、面倒くさい話です。しかも漢字の始まりと終わりを示す制御コードは3バイトもあって、データの量も増えてしまいます。とにかく昔はメモリーやディスクが高価だったので、ちょっとでも削れるところは削るというのが美徳でした。そこでうまいことを考えた人がいました。ANKコードをよく見てみると、後ろの方に使っていない領域があるのです。そこでその人は考えました。漢字コードの1バイト目がこの使っていない領域に来るようにコードを作ったら、漢字が始まるとか終わるといったことを表す制御コードは不要なのではないかと。 すなわちデータを見ていって、使っていないはずのANKコードが現れたら、それは実は漢字が始まるところだと考えるわけです。 これは非常にうまくいき、現在の日本語の文字コードの事実上の標準となりました。 しかしこうやってある意味無理矢理詰め込んだので、もはや拡張ができない状態になりました。皆さんの中にも、例えば珍しい名前なので自分の名前がワープロで正しく書けない人はいませんか?また漢文を入力しようとして漢字がなくて困った人はいませんか? 現在使われているシフトJISコードはもう空き領域がほとんどないので、そういう文字を追加したくてももう追加できない状態になっているのです。 しかも世界的に見れば非常に特殊なコードであるので、今のようにインターネットが普及してくると、互換性の問題も発生します。 ◆EUCコードシフトJISコードと同じように、半角の英数文字と漢字の混在ができるようにしたコードです。先ほどJISコードは2バイトで表されていると書きましたが、実際に使われているのはそのうちの一万文字程度でそれ以外は空きなのです。その結果JISコードは2バイトで構成されるのですが、各バイトの値は00〜7F(0〜127)の範囲しか使われていません。 そこでこのコードはJIS漢字コードの1バイト目に128を足した値を漢字のコードだとすれば、128〜255の値が来ればそれが漢字の第一バイト目だと分かるわけです。 前述の「渦」という文字であればこれのJISコードが3132なのでEUCコードはB132になります。 このコード体系は主にUNIX上で使われています。インターネットに接続されているコンピューターはUNIXで動いているものがたくさんあります。そのためインターネット上でもこのコード体系は非常に頻繁に使われています。 それはそうとこういうことをすると今度はANKコードの半角カナとぶつかってしまいます。ANKコードでは128〜255の間に半角のカナを割り当てています。すると先ほどの「渦」という字を表すはずのB132はANKコードでは「ア2」という半角文字と数字になってしまいます。 それでは一体どうすればいいでしょう?実はどうしようもないのです。今では半角カナはなければなくともかまわない存在なので、使わないようにするしかありません。皆さんもメールタイトルなどに半角のカナを使わないでくれと言われたことはありませんか?これはこういう理由があるからなのです。 ◆ユニコード今まで説明したコード体系がややこしくなっている大元の原因は、半角文字(1バイトの文字)と全角文字(2バイトの文字)が混在していることでした。だったら最初から全部2バイトでできているコードがあれば話は楽になります。コンピューターが英語圏以外でもたくさん使われるようになった現在、世界共通で使える文字コードということで制定されたのがユニコードです。ユニコードの文字は最初から全ての文字が2バイトで表されています。文を扱う際に半角とか全角とかのことを考えなくていいので、これはウインドウズやJAVAなどの内部処理用にはもう実用化されています。 しかし元が漢字のことを全然知らない外人が作った物なので、いろいろと現実に合わないところが出てきているようです。しかしそれが完璧なものではなくとも、統一してもらった方が様々な面で有り難いのは事実でしょう。 こんなに種類があると困らないか?さてさて、前章でコード体系がたくさんあることを説明しましたが、こんなにあって困らないのでしょうか? はっきり言って困っているのです。 一体どんなことが起こるかというと・・・ 文字化けの問題ブラウザーでホームページを見ていると、時々画面がぐしゃぐしゃになっているところがあります。これはほとんどは使用されている文字コードが設定されているものと異なっているためです。多くの場合はブラウザーの文書の文字コードセットを切り替えることで直りますが、うっとうしいものです。半角カナの問題それより困るのが半角カナの問題です。半角カナはANKコードで定められた128〜255の間にありますが、インターネットにつながれているコンピューターの中には、結構古い物があって、アスキーコードしか使えない物があります。こういうコンピューターに半角カナを使ったデータを送ると、よくて文字がぐしゃぐしゃになり、最悪の場合はデータが壊れてしまう場合もあります。作る手間の問題コードがたくさんあればそれを扱うための手間は確実に増えます。しかも文書によってはあらかじめ何のコードで書かれているかが分からないこともあります。それをチェックして正しく表示させるのは大変な作業です。それはソフトウェアの制作コストなどに直接反映されてしまいます。というわけでしばらくはこういうコード体系があると言うことを覚えておいて、個々に対応するしかないのが現状です。 |