パソコンの中の日本語2003.9.20


 

JIS漢字コード
 

 JIS漢字コードは1978年に最初のものが発表され、
JIS X 0208-1983/1990/1997と進化 してきました。
 94 x 94の升目の中に文字が配置され,区点コードを持っています。 区とはY軸、点とはX軸に相当します。

 仮名は26文字ですが、JIS漢字コードとは別に、1バイト仮名コード(JISX 0201)もありました。

 

ビットとバイトと16進コード
 

 コンピユータの単位は1ピットです。1ビットは電気のオンまたはオフ。0か1です。これを8個まとめて1バイトといいます。10進数だと2の8乗=256まで表現できます。
     ○○○○○○○○  0
     ●●●●●●●●  255
	  
1バイトは上と下の4ビットに分け16進で表現されます。
     ○○○○○○○○  0
        0   0  00
     ○○○○○○○●  1
        0   1  01
     ○○○○○○●○  2
        0  20  02
     ○○○○○●○○  4
        0 400  04
     ○○○○●○○○  8
        08000  08
     ○○○○●○○●  9
        0   9  09
     ○○○○●○●○  10
        0   A  0A
     ○○○○●○●●  11
        0   B  0B
     ○○○○●●○○  12
        0   C  0C
     ○○○○●●○●  13
        0   D  0D
     ○○○○●●●○  14
        0   E  0E
     ○○○○●●●●  15
        0   F  0F
					   
     ●●●●●●●●  255
        F   F  FF
		
     ○●●●●●●●  127
        7   F  7F	   

 

アルファベットとASCIIコード
 

 英語のアルファベットは、大小文字合計でわずか48。それに0〜9の数字と、いくつかの記号を加えても94のキャラクタ。これを、7ビット(2の7乗=128)一列に並べたものがASCIIと呼ばれるコード。
 数字の0は0番かといえば、そうではありません。16進で30番です。1は31番。
     ○○●●○○○○  --> 0
        3   0  30
     ○○●●○○○●  --> 1
        3   1  31
     ○○●●○○●○  --> 2
        3  2   32
		
		
     ○○●●●○○○  --> 8
        38     38
     ○○●●●○○●  --> 9
        3   9  39
    
アルファベットAは、16進で3A番かといえば、そうではありません。
     ○●○○○○○●  --> A
        4   1  41
     ○●○○○○●○  --> B
        4  2   42

ASCIIコード表


 

日本語用ASCIIコード
 

 日本語用の文字コードとして最初に制定されたのがJIS X 0201です。

 ASCIIコード表は一列。00から7Fで終り。英語文化圏の人は単純明快。言葉の問題でコンピユータと格闘する必要がありませんでした。日本人も仮名を公用語にしてしまえば、それで良かった訳です。1バイト仮名(JISX 0201)は、A1からDEに割り付けました。

 昔輸入した漢字が、すっかり文化に根付いています。カタカナの銀行通帳の印刷を見て、文化は感じられませんね。コンピユータで計算しましたというと、あっさり承認される報告書も、いざ収める段になると、ワープロで清書してよと注文がつきます。漢字の処理できないパソコンは売れませんでした。

 

シフトJIS
 

 パソコンの登場により、漢字にコードを割り付けるルールが必要でした。 漢字は多いので、平面上に縦、横を示す区点で配列していました。これをパソコンでどう扱うかです。日本のパソコン業界 の共通ルールとして「シフトJIS」を決めました。WindowsやMacは 「シフトJIS」です。日本語対応のソフトも自然と「シフトJIS」となりました。

 「シフトJIS」は日本語用ASCIIコードで未定義になっている部分を使って漢字(X 0208)を表現したものです。JISの文字配列を崩さず、一部を平行移動(シフト)させコードを割り当てました。
 00から7FはASCIIコードが使っています。A1からDEに1バイト仮名(JISX 0201)が割り付けられています。残るは、80から9FとE0からFFまでです。

 80〜9FとE0〜FFの横に40〜FCの横軸を設け、2次元化しました。 この2つの平面空間にJIS漢字コードの文字セットをシフトして収めました。

 タイピストという職業がありました。区点配列の活字箱の上にレバーを持って行き、ガチャンと押してタイプします。慣れないと、とてもできる作業ではありませんでした。 パソコンでも同じようなことは出来ます。しかし、パソコンはもっと賢い能力を持っていました。ローマ字で打ち込んでひらがなに変換、それを漢字に連想変換という方法です。FEPというプロセッサーが日本語PCで開発されました。これは、日本が誇れるパソコン文化です。

 日本語キーボードには、英数、カタカナ、ひらがな、漢字番号のモード切り替えキーもありますが、どうして切り替えるのか、よく分かりません。使ったことがありません。しかし、ひらがなモードにして、「あ」というキーを押せば、画面に「あ」と表示する電気回路は用意されています。日本語タイプライターのように、漢字の並んだキーボードを作ろうとした人も居たでしょう。しかし、パソコンはFEPというプロセッサーが主役となりました。このプロセッサーは、最終的に選択された漢字のコードをパソコンに指令して画面に漢字を描画させます。「シフトJIS」コードはワープロを開発するための社会基盤だったわけです。

 

インターネットメール
 

 ASCII文字しかやりとりできない電子メールに、世界標準が出来たのは1992年のことです。MIME(Multipurpose Internet Mail Extensions)でASCII以外でもやり取り出来るルールを決めました。
 インターネットメールサーバーSMTP(Simple Mail Transfer Protocol)の決まり事で、メールは〔ヘッダ〕空白行〔本文〕となっています。

 〔ヘッダ〕は
=?ISO-2022-JP?B? エンコードされた文字列 ?=
といったルールで、結局ASCIIコードに変換して送ります。

 〔本文〕はエスケープシーケンスが現れるとASCII以外と判断して処理する仕組みです。コードとしては、JISコードそのものを採用しました。

 文字の送信には、前後にエスケープシーケンスを付ける方法がありました。パソコンの文字コードの基本はASCIIコードです。第8ビット目は使う必要はありません。 8ビット目は使わないという慣習が国際規格となってしまいます。 英語系の文字でも、ギリシャ文字が必要な場合があります。こういう場合、同じコードを使いながら、エスケープシーケンスを発行するとギリシャ文字モードにするという使い方をしていました。
 「シフトJIS」は、第8ビット目を使って、エスケープシーケンスなしで1バイト文字と2バイト文字を共存できるようにしました。さすが、といえる工夫をしたわけです。

 ところうが、8ビット目を使わないという慣習が国際規格となってしまい、1983年のJIS改訂となりました。単にJISコードと呼ぶのは、この改定以後の「新JIS」で、ISO-2022-JPとも呼びます。「シフトJIS」は「旧JIS」をベースにしています。DOS系のメールソフトは「新JIS」に変換して流すようにしていますが、メールで文字化けは、この辺の事情が関連しています。

 

「新JIS」と「旧JIS」
 

 JIS漢字コードは,特殊文字108、数字10、ローマ字52、ひらがな83、カタカナ86、ギリシア文字48、ロシア文字66、第一水準漢字2965、第二水 準漢字3384で、合計6802文字。日本語の文化と歴史を担うもの。

 1981年、常用漢字が導入され、それを反映するため1983年に「JIS」が改正された。
  • 新字体と旧字体22文字を第1水準と第2水準の間で入れ替え。
  • 人名漢字4文字の追加。
  • 39個の記号と32個の罫線文字の追加。
  • 250字の字形の変更。
これが「新JIS」と呼ばれるもの。その後の修正はあるが、大きな変更はない。

 パソコンの誕生とFEP、ワープロの開発競争の中で、JISという決め事の変更だけの問題ではなくなっていた。「シフトJIS」は「旧JIS」をベースにしていた。国民機として、そのシェア競争のトップを握ったNECは、漢字をROMに焼きつけてしまっていた。漢字コードを最も利用するパソコンユーザーは「旧JIS」の世界で、爆発的に拡大していった。

 こうして、日本の文字コードに「新JIS」、「旧JIS」という歴史が刻まれた。多分、国語学識経験者は、事の重大さに身震いしただろう。

 

エスケープシーケンス
 

 DOSの時代、バッチファイルのECHO文に、文字と混ぜて書いておくと、画面文字に色をつけられた。そんな裏技で、エスケープシーケンスはお馴染みのもの。

 ASCIIコード表を眺めると、文字以外の制御コードがあるのが分かる。これだけの機能があれば,制御コードで動作する電動タイプライターがあれば通信線を仲介して海外から文書を書き送ることが出来る。つまり、テレックスという事。
 電子計算機、コンピユータに最初に繋がれたのが、プリンターであったことは、しごく当然の成り行きだったことが分かる。

 エスケープシーケンスは、プリンターやモニターに文字コードを送るとき、 それに混ぜて送り、制御するもの。コード1Bに続く2文字の組み合わせという決め事が出来た。ASCIIで1BはESC(エスケープ)。

 ASCIIコードを拡張して仮名を割り付けた日本語ASCIIコード、これは無しにしよう。これが日本語JISの立場。1バイト仮名コード(JISX 0201)として残っているが、20から5Cの範囲に割り付け、7ビット系として残る。

 例えば、送られて来たコードが32だったとしよう。ASCIIコードなら「3」、1バイト仮名なら「イ」、2バイト漢字なら、その次のコードを読まないと確定できない。
 日本語のJISコードは次の6つを区別しないと混乱する。ソフトではエスケープシーケンスで区別することになった。
  • 1B2842---> ASCII
  • 1B284A--->日本語用ASCIIのローマ字部(JIS X 0201)
  • 1B2849--->日本語用ASCIIのかたかな部(JIS X 0201)
  • 1B2440--->「旧JIS」(JIS X 0208:1978 )
  • 1B2442--->「新JIS」(JIS X 0208:1983)
  • 1B2444--->JIS補助漢字(JIS X 0212)
これだけを扱わなければならない。

 例えば、地番「2のイ」を新JISでコード化すれば、
  2332 244E 2524
しかし、「2」を半角、「の」を全角、「イ」を半角として入力すると
  32 244E 32
正式にはエスケープシーケンスを挟んで
  1B284A 32 1B2442 244E 1B2849 32


 インターネットのメーラーは、一々エスケープシーケンスをチェックして文字を表示している。結構大変な作業をしていることが分かる。 送る方できちっと対処していても、受ける方で「半角カナ」は無視している 事もある。
 JIS X 0201は半角文字の入出力として利用されている。ワープロでは、半角カナとして便利に利用されている。日本語のすべてをJIS X 0208はカバーしているので、全角を使えば不都合は無いのだが。そこで、「半角カナは使わない」キャンペーンはあるが、無視することは無謀といえる。
 文字化けメールを受け取った場合、送り主を非難することは軽率と言える。 自分のメーラーのことを点検してみる必要がある。

 

EUC
 

 パソコンが誕生の頃、ミニコンから進化したワークステーション、オフコンが企業では 使われていました。OSはUnix。ここでの日本語はEUCコードでした。

EUCで扱う文字コード
セット 第1バイト 第2バイト 第3バイト 日本語EUCの場合
G0 0x21〜0x7E - - ASCII
G1 0xA0〜0xFF 0xA0〜0xFF - JIS X 0208-1990(新JIS)
G2 0x8E 0xA0〜0xFF - JIS X 0201カナ(1バイト仮名)
G3 0x8F 0xA0〜0xFF 0xA0〜0xFF JIS X 0212-1990(補助漢字)

 EUCコードも8ビット目を使っています。最近16ビット体系で世界の文字コード を統一するUnicodeへの動きがあります。Unixも対応するのだろう。

 ワークステーションに憧れつつPCでMSDOSを使う者、または企業でオフコンを使いながら個人占有できるコンピューターを愛した者。彼らがPCを育てた。パソコンを使うものにはUnixは憧れであった。

 マイクロソフトに、ワークステーションOSとしてWindowsNTがあったが、メジャーではなかった。このNTの内部コードはUnicodeであつた。
 同じマイクロソフトといえども、MSDOSとWindowsNTとは別物。Windowsの同じ包装紙で包んでもWindows98とNTは別物と知っていた。WindowsMEで、その事を意識せず購入して大変な状況を経験した人は少なくないだろう。 あこがれのUnixにはLinuxへの道が開けている。Windows98はUnicodeには 対応できない。Linuxへの準備が急がれる。

 

テキストファイル
 

 2004年の現在、世界のパソコンの90%以上がマイクロソフトのWindowsという 状況だ。そして、インターネットの世界で、圧倒的多数の「見る人」はInternet  Explorerで覗いている。一方、「見られる側」はUNIXサーバーを利用している。僕もそうなのだが、2つのOSを利用しているが、これと言って不都合は感じていない。一体、どうしてなのだろう。
 OSと、その上のアプリケーションを乗り換えるのは大変なことだ。1995年、MSDOSからWindowsへの乗り換えは、同じマイクロソフトといえども大変だった。大変は覚悟の上で、MacかWindowsかの選択も視野に入れていたので乗り切れたとも言える。
 2004年の現在、インターネットの魅力に惹かれWindowsをベース基地としUNIXサーバーを利用しているが、違和感を持たない。それがインターネットということなのだろうか。

 多分、その秘密はテキストファイルにあるのだろう。テキストファイルは、すべてキャラクタコードからなるファイルを言う。制御コードは改行だけ。最も原点に近いASCIIコードのみで書けば、どのOSでも通用する。だから、プログラムソースは半角英字を使う。こうしておけば、Windowsで作ったCGIもUNIXサーバーへ送って問題はない。
 インターネットをここまで普及させたのはWebサイトだろう。その記述言語、HTMLはテキストファイルだ。タグという表示コードを含むのだが、タグもキャラクタコードの集合。見る人のパソコンでタグは解釈されレーアウトされる。画像は別ファイルから合成される。それを実行するのは、パソコンユーザーが持っているブラウザ。
 ハソコンの能力がひ弱だった頃、とても実用的でなかったソースコードを直接読んで実行するインタープリタ手法が、現在は主役となった。それほどまでにパソコンの能力が上がったということだろう。

 インターネット時代の主役、テキストファイル。そのキャラクタコードにも、日本という環境だけでも、こんなに多くの歴史が蓄積されている。多様なOSの歴史と、各国の言語と文化の事情を考えれば、一つにまとめてしまう事は出来ないことだろう。それを、一番良く知っているのは、僕達日本人ではないだろうか。少し複雑系とも言えれ文字コードを使いこなしている事に、誇りを持っていいと僕は思っている。

 文字コードの変換は、規則性があるので、コンピューターにとってそれ程、困難な作業ではない。Webサーバーとブラウザの間では、送るデータのコードを事前に知らせることが出来る。最近のブラウザは自動的に文字コードの判定をしてくれる。コード宣言なしでも、一つのページでコードを統一しておけば問題はないようだ。
 ページにFORM入力がある場合、それを受け取って利用するCGIでは、入力データーのコードを判定する必要である。Perlの標準ライブラリーにこのツールはないので、お世話になるのがKazumasaUtashiro氏のjcode.plだ。JISコードの変遷をフォローする氏に敬意を表しつつ、利用させていただくことになる。


 

「/」と「\」と「¥」
 

 Windows98のCGIテスト環境で完成したソースをUnixのサーバーにインストールする場合、どんな問題があるのだろうか。

 ブラウザでURLの階層を示すのに「/」を使う。これは、UNIXOSで階層を「/」で表現しているからだ。日本語Windowsでは、OSの階層に「¥」を使う。英語Windowsでは「\」を使った。
 日本語のASCII コード表で5Cは「¥」と表示されるが、本来の英語のASCIIでは 「\」と表示される。日本語環境にするとキーボードの「\」を押すと「¥」と表示されるが、書き込まれるコードは5C。ソースコードにおいて、動作に支障はない。日本のJISコードが5Cに「¥」を割り付けているためだ。

 HTML関連でURLの階層を示すのに「/」を使った。はじめからネットワークOSのUNIXでは、ローカルのハードデイスクの階層とネット全体の階層はシームレスに表現される。マイクロソフトのMSDOSはハードデイスクの階層を「\」で表現した。それが日本に来て「¥」になった。
 インターネットの時代になって、本来の「/」の意味が分かってくる。僕達日本人は複雑系で生きる宿命を背負っている。覚悟しておこう。それはそれで、いいではないか。常に工夫で乗り越えて来たのだから。
 CGIではASCIIの制御コードを使う。制御コードを「メタ文字」と呼ぶが、この識別に「¥」を使う。当然として英語Windowsでは「\」。本家のUNIXではどうなの?
 「¥」のままでUNIXサーバーに送ってもトラブルは起きていない。サーバーでモニターすれば「\」だ。
 CGIでUNIXの世界を知ると、MSDOSがどん世界の中の地域であったかが分かる。そのまた「日本」という地方で僕達は奮戦していたことも分かる。「/」と「\」と「¥」。この三層構造を乗り越えた上に、日本のパソコン文化が花開いた訳だ。僕はこの花が、とても華麗だと信じている。


 

改行コード
 

 Windows 環境とUNIXの二つを利用する場合、もう一つ厄介なのが 改行コード の話し。
 Windows では CR/LF で改行、 Mac では CR 改行、 UNIX では LF 改行、すべてばらばらだった。「メモ帳」でファイルを開 いたら、改行されずに横へずらずらとテキストが表示された経験があると 思う。これは、改行コードの違いだ。

 Windows版のPerlを使う場合、ソースコードの中で改行は「¥n」とする。DOS窓のモニター上で改行される。Windows版のPerlが「¥n」からCR/LFを発行するように仕組んであるのだろう。

 出来あがったCGIのソースをサーバーに送る。FTPではアスキーモードで送る。この場合、CR/LF をLFに変換できる。変換したくないなら、バイナリーモードで送る。
 どこかで誰かがうまく処理してくれている。だが、結果の確認は利用する個人の責任ですることになる。コード複雑系の日本の宿命といえる。改めてどうだったか考えると混乱する。結果が良ければそれでよし。このことを「いいかげん」と思ってはいけません。「キャリブレーション」といって、工学的には立派な技術です。おそらく、「キャリブレーション」技術で世界一なのは僕達だと思う。

 最後に、Windows98環境の複雑系の事例を一つ。

 Windows98はOSレベルで、大文字小文字を区別しない。例えば、画像の拡張子JPG。エクスプローラーでjpgでもJPGかもしれない。サーバーに送ってJPGだったことが分かることがある。
 書き送ったHTMLページで画像が表示されない。どうしてなのか、最初は理由が分からなかった。膨大な画像の拡張子を書き換えたことがある。
 ある画像処理ソフトはJPGを使う。それを編集するソフトを使うとjpgになってしまう。僕の環境では、そういう話だ。FTPで大文字小文字を区別するか、全部小文字に変換していまうか、選択できる。

 もう一般論などあり得ない、各個人のお家の事情とでもいおうか。やってみないと分からない複雑系の話。


2003.9.20
by Kon