読者です 読者をやめる 読者になる 読者になる

バックスラッシュと円記号の悲劇

 Windowsのパス表示を見てみよう。Explorerでは

f:id:juangotoh:20160613085940j:plain

 コマンドプロンプトでは

f:id:juangotoh:20160613090219j:plain

 というようにパスの区切りは「¥」で表示される。これ、おかしいと思わないだろうか。なぜ円記号なのだ。通貨の円に、なにかを切り分ける意味があるわけでもないし、見た目、文字の形が区切りにふさわしいとも思えない。Yに横棒二本つけた記号である。通貨の円を表す以外に使うべきではない。そもそもファイルパスの区切りに円記号を使おうと思った人は誰だ?となるだろう。もちろんそんな人はいない。これはMS-DOS登場以来現在に至るまで、日本語PC環境でずーっと続いている文字化けである。MS-DOSWindowsの解説書でも円記号で印刷されているので、文字化けだとは思わない人も多いだろうが、どう考えても文字化けである。日本以外の多くの環境ではWindowsのパス区切り文字はバックスラッシュ「\」で表示される。

 

 UNIXではパスの区切りにスラッシュ「/」を使う。これは日本語環境でも化けない。

f:id:juangotoh:20160613091215j:plain

 スラッシュはもともと日付や数字などを区切るのに用いられる記号であるので、パスの区切りに使用するのに違和感がない。MS-DOSもこれをそのまま使えばよかったのだが、スラッシュの傾きを逆にしたバックスラッシュを使用することになった。これは別にUNIXに対抗して逆にしたわけではない。

 MS-DOSマイクロソフトが一から開発したわけではなく、IBMの要請に答え急遽OSを調達しなければならなくなったため、ティム・パターソンという人が開発していたQDOSを購入、IBM-PC用に改造したものだ。このQDOSというのは、デジタルリサーチ社の8080用OS、CP/Mをほぼ真似して8086用に開発されたもので、最初の頃はCP/Mと同様階層型ファイルシステムを備えておらず、ファイルがディレクトリに収められずディスク上の一つの階層だけに全部置かれていた。なので「パス区切り」という概念自体がなかった。

 MS-DOS 2.0から階層構造が取り入れられたが、お手本にしたCP/Mがそうであったために、MS-DOSコマンドラインオプションを表す記号としてすでにスラッシュを使用していた。オプション記号とパス区切りが同じだとミスやプログラムのエラーを引き起こす可能性があるため、パス区切りにスラッシュを使うことができなかった。そこで、ほぼ同じ形のバックスラッシュを使用した。

 

 ところでそもそもスラッシュとかバックスラッシュがコンピューターの画面上で斜めの直線で表示されるのは、そういう文字コードが定義されているからだ。もともとアメリカで作成されたASCIIという文字コード体系は、7bitの文字コードを英数字や各種記号に割り当てたもので、現代の文字コードの遠い先祖にあたる。このASCIIがコンピューター業界で広く使用され、国際規格、ISO 646として制定される。ASCIIはあくまでアメリカで一般に使用される英数記号を定めたものだったので、ヨーロッパやアジアではそのまま使うと不足する部分が出てくる。そこでISO 646は、ASCIIのうち12の記号に関しては各国の必要に応じて変更できることが定められた。

 ISO 646をもとに、日本で制定されたのがJIS X 0201である。これは一般にASCIIにカタカナを加えたコードと思われているが、ASCII部分の中で、2つだけ変更が加えられている。もちろんISO 646で変更可能とされた部分だ。それはチルダをオーバーラインにしたことと、バックスラッシュを円記号にしたことだ。

 

 つまり、このときバックスラッシュが円記号「¥」になってしまったために、日本ではMS-DOSのパスが文字化けするようになってしまったのだ。なぜこんなことになってしまったのか。ISO 646で変更可能とされた部分というのは、「#$@[\]^`{|}~」である。このうち、おそらく日本での使用頻度が一番低そうなのがバックスラッシュだったのだろう。

 ところでASCIIは7bit(0x00~0x7F)のコードであるが、JIS X 0201は7bitもしくは8bitで使う文字集合であり、0x80以降も使える。そこにはカタカナと句読点、かぎ括弧などが定義され、0xE0から0xFEまでは未定義である。この未定義領域に「¥」を入れればよかったんじゃないか、また、0xA0は0x20と同じ空白であり、こんな見た目区別つかない空白を二つも入れたら混乱するだけだからここに「¥」を入れたらと思うのだが、「7bitもしくは8bit」用なので、8bit使えない環境も想定されている。その場合前半の英数記号だけ、または、前半後半を切り替えながら、コードとしてはあくまで7bitとして使うことが想定されている。7bitで、かつカタカナも入れられないようなチープな環境を考え、英数記号だけのコンピューターや端末上で使用する場合でも、通貨記号の「¥」だけは使えるようにと考えると、前半のASCII互換部分のどれかを「¥」に置き換える必要がある。カタカナが使える環境なら当然前半の英数記号も使えるわけだから、どの環境でも¥が使えるには、前半に置くべきだったわけだ。

 しかし僕はあのパス区切りが¥で表示されるのが嫌いで嫌いで仕方ない。こうならないためには過去なにが違っていれば良かったのか。やはりティム・パターソンがオプション記号に「/」を使わなければ良かったのか。

 いや、それでMS-DOS、ひいてはWindowsのパス区切りが「/」になっていたとしても、それだけでは文字化けの「¥」は消えない。cを始めとする多くのプログラミング言語で、文字列のエスケープにバックスラッシュを使用する。ヌル文字を表す「\0」が「¥0」と表示されるのも気持ち悪い。rogueで死んだときに墓石に「¥」がいっぱい並ぶのも気持ち悪い

f:id:juangotoh:20160613101303j:plain

 

 やはりJIS X 0201がバックスラッシュを円記号に置き換えたのがいけなかったと思う。カタカナ側の空き領域に入れときゃよかったじゃん。のちのShift-JIS作るときに面倒なことになったかもしれないけど。いや、そんなことはJIS X 0201制定時にはまだ知った事じゃなかったはずだし。7bit環境で「¥」が使えなくても、たいした問題ではないような気がするんだけど。「¥1000」のかわりに、「Y1000」とか、「1000 Yen」とか書いてもいいわけでしょ。カタカナ使える環境だけ「¥」も使用可能という形でも特に問題なかったと思うよ。

 

 ちなみに、MacOS Xになるまえの、クラシックMac OSで使用された日本語文字コード、MacJapaneseでは、0x80にバックスラッシュが割り当てられていた。MacPlusでrogue移植したときは、墓石のAAに使われてたバックスラッシュ(0x5C)をこの0x80のバックスラッシュで置き換えたものである。Shift-JISの1バイト目に使われてたのは、0x81からで、0x80は空いていたため、Appleはここにバックスラッシュを入れていたのだな。もちろんこれだと、バックスラッシュが必要な部分を書き換えないといけないので、一般的な問題の解決にはならない。

 

 現代では、OS内部で使われる文字コードがほぼUnicodeになっており、もちろんバックスラッシュも円記号も区別できる(U+005Cがバックスラッシュ、U+00A5が円記号)はずなののだが、バックスラッシュと円記号がかつて同じコードだった都合上、残された書類の中で通貨記号とパス区切り、もしくはAA用の斜め線部品の用途が完全に混ざってしまっているので、過去の書類をどう表示するかを考えると、0x5Cをバックスラッシュと一律に固定することができない。どちらかというと「今までと同じように見えた方がいい」という意味で、日本のWindows上などでは、相変わらず円記号で表示されることになる。