yasuokaの日記: YEN SIGN問題縁起 10
1983年3月にMS-DOS 2.0をリリースした際、Microsoftはディレクトリの区切記号を0x5Cにするという愚を犯した。0x5CはISO 646の国内使用箇所なので、各国ごとに収録されている文字が異なっている。この結果、アメリカのMS-DOSでは「\」がディレクトリの区切記号だが、日本のMS-DOSでは「¥」がディレクトリの区切記号となった。しかも、当時のアメリカのMS-DOSは、IBM-PCの文字コード(のちのCP437)をそのまま採用しており、そこでは「¥」が0x9Dに収録されていた。つまり「¥」は、日本のMS-DOSではディレクトリの区切記号だったが、アメリカのMS-DOSではディレクトリの区切記号ではなかった。1983年5月にリリースされたMS-DOS 2.01漢字版においても、文字コードはシフトJISに拡張されたものの、やはり0x5Cは「¥」だった。
1991年6月に出版された『The Unicode Standard, Version 1.0, Volume 1』では、「¥」はU+00A5に収録された。この本には、CP437やシフトJISとの対応表も収録されており、CP437の0x5CはU+005Cの「\」に、CP437の0x9DはU+00A5の「¥」に、シフトJISの0x5CはU+00A5の「¥」に対応づけられた。Unicodeはあくまで文字コードなのだから、文字の符号化を考える限り、当然の措置である。つまりUnicodeをマジメに実装するなら、MicrosoftはU+00A5に対して、日本とアメリカで異なる動作をするようにしなければならない、ということになる。ISO 646の国内使用箇所を軽ろんじた報いだ。
ところが、1996年1月12日にMicrosoftのLori HoerthとK. D. Changが発表した『cp932_ShiftJIS to Unicode table, Version 1.0』には「0x5C 0x005C # REVERSE SOLIDUS (rendered as Halfwidth Yen Sign)」という対応が示されていた。0x5Cに対してU+005Cの「\」を対応させるが、表示には円記号を用いる、というトンでもない解決法である。そりゃ、MicrosoftのCP932だけを見た時は、それでいいかもしれないが、Unicodeとの変換をおこなう他の文字コードから見ればいい迷惑だ。つまるところ、文字コードのレベルでは本来解決できない事柄を、ムリヤリ文字コードで何とかしようとして、Unicodeの文字コードとしての一意性を破壊しているわけである。
文字コード関係の文句はソフトウェアベンダーに言うべきじゃないかなぁにもコメントしたが、結局YEN SIGN問題は、MS-DOS 2.0の実装において、MicrosoftがISO 646を全く理解していなかったために起こった問題だ。しかも、その問題をMicrosoft自身は、マジメに解決しようとしていない。UnicodeのU+005CやU+00A5を用いる全ての文字コードやそのユーザに、代価を押し付けようとしているだけである。
0x5cがエスケープ記号である限りは問題が起こっていたのではないでしょうか (スコア:1)
もちろん0x5cをバックスラッシュにして円記号にしなければ回避できたとは思いますが、日本国内事情を考えるとそれは不可能だったのではないでしょうか。
(円記号は必要でしたでしょうし、他に円記号が割り当てられている場所はありませんでしたから……たぶん)
最近はWindowsを使っていても0x5cはバックスラッシュとして表示されることも多いですから、そのうち気がつけば0x5cはバックスラッシュ、ということで落ち着くのかもしれません。
Re:0x5cがエスケープ記号である限りは問題が起こっていたのではないでしょうか (スコア:2, すばらしい洞察)
これに対しMS-DOS系では、各国ごとに異なる文字コードを0x00-0x7Fに規定してしまった、というのがそもそものミスです。しかも、そういう環境下においては、たとえばCやC++のプログラムを書く際にも、trigraph sequenceを使わなきゃいけないはずですが、そもそもC#にはtrigraphがない。そういう点で、Microsoftは文字コードの国際規格を全く無視してて、私はすごくキライなんです。
ただ、確かにMicrosoftだけが悪いんじゃなくて、Unicodeの方もどうかしてた、ってのは言えます。だって、JIS X 0201の0x5Cの「¥」と、GB 1988の0x24の「¥」と、ISO 8859-1の0xA5の「¥」とに、同じU+00A5を対応させちゃったんですから。Unicodeの常識から言えば、これらはそれぞれYEN SIGNとYUAN SIGNとYEN-YUAN SIGN(かしら?)という異なる文字であって、それぞれ別のコードが割り当てられて当然なんですよ。少なくとも、JIS X 0201の0x5Cと、ISO 8859-1の0xA5とで、異なるUnicodeが対応してたら、まだやりようがあったんじゃないかと思えるのです。
Re:0x5cがエスケープ記号である限りは問題が起こっていたのではないでしょうか (スコア:1)
UnicodeのU+0000~U+007FおよびU+0080~U+00FF領域に「全世界で共通する文字を示すべき」を割り当てるのは、もともと無理な話だったのでは……(もちろん規格上の話ではなく、各国のお国事情を反映させた場合)。
同一性を保てる見込みのないアドレスは使われないようにするのが最善かと思うものの、現実にはU+005CもU+00A5も多用されてしまっているので、せめて通貨記号の意図で使っている部分を分離する&U+005CとU+00A5を通貨記号用途から外すという感じの対策は必要かな、と考えてみたり。
たとえば、
「UnicodeのU+0000~U+007F領域のうち、国によって表示文字が異なる部分は、全て特定の国にとって有利とならない符号で固定する……たとえば、CS1(U+005C)はコインを表す抽象図案に変更・CS2(U+00A5)はバックスラッシュ(\)に固定。」
「UnicodeのU+0080~U+00FF領域は使用禁止とする」
などという方針が出ることはあるのでしょうか……って、そんなことをしたらUnicodeの対応性が(U+005Cについて)さらに崩れてしまうだけですねorz
#これって、隣国でも同じように話題になっているのでしょうか。
初期のUnicode Draft (スコア:1)
>#これって、隣国でも同じように話題になっているのでしょうか。
現在の中国では、GB 18030こそが唯一の文字コードで、Unicodeすらオマケに過ぎませんから。GB 18030の0x24は「¥」ですけど、0x5Cは「\」なので、そう問題にはなってないのかな?
UNIX系OSで起こっていた(気がする)問題 (スコア:1)
(元ネタを思い出したら追記します)
#今回のネタとは直接関係なかったり、
#勘違いかもしれませんが、いちおう。
Re:0x5cがエスケープ記号である限りは問題が起こっていたのではないでしょうか (スコア:0)
Re:0x5cがエスケープ記号である限りは問題が起こっていたのではないでしょうか (スコア:1)
どうやら Vista でも Meiryo フォントは U+005c を円記号とするらしいので、その期待は甘いかもしれません。
Vista は、U+005c をバックスラッシュにするいいタイミングだと思うんですけどねーー。
W-ZERO3のInternet Explorer (スコア:1)
Re:W-ZERO3のInternet Explorer (スコア:1)
Re:W-ZERO3のInternet Explorer (スコア:1)