「徳之島二千文辞典付属DVD」が読めないと言っている人がいると人づてに聞いた。いまから12年前に作ったDVDはSHIFT-JISコードを使っているのだが、最近主流のUTF-8のUnicodeを読む仕様になっているブラウザーを使うと文字化けする(設定を変えれば大丈夫。それにUTF-8に変換したデータも新たに用意しました)。
たぶん、普段コードのことなど考えずに生活しているからDVDのデータが読めなくて困ったのだろうと思う。それぐらいUnicodeが普及しているのはいいことなのだが。
そもそも、コードって一体何だろう。簡単に言えば数値を文字に割り当てるやり方のことだ。コンピューターは文字を直接操作することはできない。コンピューターは数値しか扱えないので数値を文字に割り当てる。たとえば、
コードはコンピューターが普及する前から存在していた。100年以上前からテレタイプというものがあって、電報のような仕組みで文字を送っていた。もちろん、人間が間に入らないで、機械同士で通信を行うのだが、1874年にはそのための5ビットの符号体系が考案され、使用されるようになったという。ビットは0か1の値で情報の最小単位だ。5ビットは0か1の数字が5個並んでいるのと同じで、5けたの2進数と考えればいい。5けたの2進数で表すことができるのは10進に直すと0から31までの数である。英語のアルファベットは26の文字なので、5ビットだと英字をすべて表すことができるが、数字も表そうとすると使えない字が出てきてしまう。(ちなみにテレタイプは100年以上にわたって使い続けられていた。1979年にJTBで旅行の予約をしたときにテレタイプで書類を打ち出すのを見たことがある。おそらくもう少し後になってもテレックスは使われていたはずである。テレックスはテレタイプを使った通信。)
そこで1900年に6ビットの記号体系が考案された。ビット数が増えたことによって0~63の数を表すことができ、それに対して英字のほか数字や記号を割り当てることができるようになった。
コンピューターで使われていたASCIIコードは7ビットに対して文字を割り当てるもので、0~127の数に対して大文字と小文字の英字、数字、記号を割り当てることができるようになった。
ここで、疑問に思った人がいるかもしれない。どうして最初から7ビットにしなかったのかと。当然の疑問だが、ビット数が増えるのはコストなのである。テレタイプの場合にはビット数が少なければそれだけ通信にかかる時間が短くなる。コンピューターの場合はビット数が大きくなればメモリーが余計に必要になり、計算時間も長くなる。だから、ぎりぎりのビット数で用を足すことを考えるのだ。
そして、コンピューターで日本語を使う必要が出てきて、カナを表すことができるコードが考案された。カナを表すためには濁点、半濁点も入れて50の文字が必要である。ASCIIコードにはこれだけの文字を収容する余裕がないので、7ビットから8ビットに拡張してカナ文字を割り当てたものがJISコードとして一般に使われるようになった。
しかし、これではカナが使えるようになっただけで漢字は使えない。そこで、JISコードが使っていない領域を活用して、2バイト(バイトは8ビットをひとまとまりとした単位)で漢字を表すコードが考案された。1バイトのカナと2バイトの漢字を同じ場所に混在させることができるコードである。これがSHIFT-JISコードである。
実はSHIFT-JISコードができるまえから漢字のためのJISコードはあって大型計算機では使われていた。しかし、1バイトのコードと混在させるのは不可能ではないが、不便なこともあって、パーソナルコンピューターではSHIFT-JISコードが使われるようになった。
全世界でパーソナルコンピューターが使われるようになると、英字だけでなく、それぞれの言語でコンピューターを使いたいという当然の要求が強くなった。日本語の漢字とカナが使えるようになったのはアジアの他の言語の文字に比べると早かったが、他の言語でも独自にコードを制定したので、同じ2バイトの組み合わせに対して違う文字が割り当てられたり、SHIFT-JISで利用していた領域を使うということが起きた。日本語の文字と英語以外の他言語の文字を混在させることはできないし、他言語の文書を読もうとすると文字化けが起きる。日本語以外の言語同士でも同じことである。
これでは不都合なので、1980年代にゼロックスが主導し、マイクロソフトやアップル、ジャストシステムなどが加わったコンソーシアム(組合、委員会)でUnicode(ユニコード)が作られた。大変な議論を重ねたうえでUnicodeが作られたのだが、その一端は『ユニコード戦記』でうかがい知ることができる。Unicodeでは世界中の言語が同じようにコンピューター上で使えることを目指している。
どんな言語の文字がUnicodeで規定されているかはWindowsでIMEパッドを表示すればわかる。IMEパッドを表示して、「文字一覧」を選択すると、左側に文字カテゴリが右側にコードの割り当てが表示される。Unicode(基本多言語面)で基本ラテン文字がまず出てくる。これは我々が英語で普通に見ている文字だが、そのあとの「ラテン1補助」でドイツ語のウムラウトやフランス語のアクサンの付いた文字、スペイン語のチルダのついた文字などが出てくる。ラテン文字拡張ABでラテン文字を使う言語の文字が大体つくされているのだろう。キリル文字、ギリシア文字、アルメニア文字に続いてヘブライ文字、アラビア文字が来、そのあとでデーバナーガリー文字などのインド亜大陸の文字、タイ文字、バリ文字、などのアジアの文字、エチオピア文字、ンコ文字などのアフリカの文字、コーカサスのグルジア文字、オガム文字(アイルランドの古い文字)ルーン文字(バイキングの時代の文字)など地球上のありとあらゆる文字が網羅されているのがわかる。おそらくこれでも十分ではないのだろうけれど、珍しい言語の文字もこのなかに入っている。「ターナ文字」や「ンコ文字」は調べてみてはじめてどこで使われているかを知ったくらいである。もちろん、ハングル、日本語のかなや漢字もこの基本多言語面に入っている。
そして、「追加多言語面」では「線文字B」や「楔形文字」「聖刻文字」のような古代に使われていた文字も規定されている。ただし、通常のWindowsではフォントが入っていないので、表示はされない。変体仮名もこの「追加多言語面」に入れられている。
このようにUnicodeでは漢字も英字も同じように使えるのだが、実際の表現法としてはいくつかのやり方がある。UTF-8、UTF-16、UTF-32などである。
ここまで来て、やっとUTF-8の説明ができるようになった。私はコードの専門家ではないので、ちょっと間違ったことを言っているかもしれない。私がしたかったのはこれから先の話だ。
UTF-8では文字の長さ、つまり1文字を表すバイト数は1から4となっている。英字や数字、記号(基本的なもの)は1バイトで、漢字やかなは3バイトで表される。SHIFT-JISでは漢字は2バイトだったので、UTF-8の日本語文書はSHIFT-JISのそれに比べて1.5倍のボリュームになる。しかし、文字化けの心配がないこと、多言語の混在が可能であることのメリットがその欠点を上回る。
「UTF-8万歳」と言いたいところだが、困ったことに遭遇してしまった。コーパスやKWICを作るための言語としてマイクロソフトのエクセルに付属しているVBAを使っているのだが、VBAはUTF-8で作ったテキストファイルをうまく読んでくれないのだ。
マイクロソフトはワードやエクセルで日本語を処理するとき、文字はUTF-16に変換する。ところが、UTF-8で作ったテキストファイルを読んで文字列を取り出してそれをもう一度テキストファイルとして書き出すと文字化けしているのだ。
同じことをSHIFT-JISのファイルでやってみると今度はうまく行く。念のためファイルをUTF-16に変換して同じことをしたらやはり文字化けした。内部処理はUTF-16でやっているというのに???
VBAで漢字の入ったテキストファイルを扱おうと思ったら、SHIFT-JISに変換すべしということになるが、どうにも納得がいかない。たとえば、UTF-8で作ったファイルの一部をエクセルのセルにコピーしてもちゃんと表示される。セルを操作するときは複数のコードを受け付けるのにVBAだけおいてけぼりにされているのだ。
これではちょっと困るので、エクセルを最新版に更新したのだが、同じことだった。VBAはあんまり大事にされていない。