円マークとバックスラッシュ

プログラマの苦悩というか小話を書いてみます。

皆さんの環境では次の文字はどのように表示されますでしょうか。

¥

多分「円マーク」が表示されると思います。稀に文字化けしたり四角が表示されるかもしれませんが。

ではこれは?

\

バックスラッシュ(スラッシュ"/"と反対の向きのスラッシュ)が表示された人は、「正しく」文字を表示できている環境です。円マークになってしまった場合は、それは「正しくない」環境です。(何を持って正しいかというのは難しいところですが、ここではそういう事にしておきます)

コンピュータの世界における文字

コンピュータは数字しか解釈しないので、画像も文字も音楽もすべて数字による計算の問題に置き換えてあげる必要があります。と、言うとコンピュータに疎い人は驚くかもしれませんが、そういうものなんです。プログラマの仕事は現実の世界の問題や事象を数字の世界に置き換えてあげることです。

文字を扱うとき、コンピュータの世界では文字セット(キャラクタセット)と符号化方式(エンコード)という二つの概念を使います。文字セットとはその名の通り文字の集合で、日本語で出てくる文字の集合(JIS X 0212)とか、英数字とか、世界中で使われている文字のほとんどを含むようなもの(Unicode)とか、いろんな文字の集合があります。

で、その文字の集合に対して、(16進数の)番号を振っていきます。これが文字コードです。

後述する符号化方式(エンコード)の事や、文字セットまでごっちゃにして単に「文字コード」と呼んでいる人がたくさんいますが、ここでは置いときます。

符号化方式は何かというと、その番号を実際のコンピュータ上で使用するためにどのように数字を割り当てていくか…という規約を決めたものになります。えっ、文字コードという番号を決めたのに、その番号をまた別の番号に変換するの?と思ったでしょう。思ってください。思いましたね?

なぜそんなまどろっこしい事をしているのかというと、「1文字をx個の数字で表します」と国際的に決めてしまったら「えっ、うちのコンピュータ(ソフト)はy個単位でしか処理できないんだけど」「いや、その番号の振り方は冗長すぎる。こうすればもっと短くなる」「いやいや、あまりにビット長にこだわったら計算処理にコストがかかっちゃうよ。電源が限られてるモバイラーの事も考えてよ」などと議論が紛糾することになります。なので、「文字の集合と文字コードは決めました。あとは各々やりやすいように実際のコンピュータで使う番号を独自に割り当てていってね」というのが、文字コードと実際に扱われる数値(符号化方式)を分けている主旨なのです。

そいで、その符号化体系としてShift_JISやらEUC-JPやらUTF-8とかUTF-16とかいうエンコーディングがあるわけですね。これらはコンピュータに詳しく無くても何か聞いたことがある、という人も多いでしょう。昔はブラウザから文字コードの解釈を手動で出来たりしました。

ASCIIとバックスラッシュと円マーク

ここでようやく本題に入っていきます。

その昔、アメリカでコンピュータ上で文字を扱う方法としてASCIIというものがありました。これは、テレプリンター(テレタイプ)という、電話回線を使って文字をやり取りするプリンタのためにベル研究所が1960年から作り始めて1963年に制定された規格で、その後ISO/IEC 646として国際規格化されます。

ただ、このころはまだ文字コードと文字集合、エンコードの概念もまだごっちゃになっていました。コンピュータの性能も良く無いし、そもそもインターネットが存在しなかったことから「全世界の文字を統一的に扱える仕組みを作ろう」などという議論がそもそも無かった(もしくは優先度が低かった)ことが背景と思われます。

で、ISO/IEC 646は各国で固有に置き換えてよい12個の符号を規定していました。これが全ての元凶でした。この符号に対しては各国で好き勝手に文字を振ってしまったのです。

wikipediaにその例が掲載されていますが、ここでもともとのASCIIではバックスラッシュだったところ(5Cという文字コード)に日本では円マークを振ってJIS X 0201として規格化してしまいました。(ちなみに、wikipediaの表をみるとまだ日本などはマシで、ドイツあたりはひどいことになっています)

このために、JIS規格ではバックスラッシュの文字コード(文字符号)に円マークが割当たってるわけです。

問題発生

その後、ASCIIはパーソナルコンピュータの世界にも引き継がれます。日本語キーボードには「¥」の文字が刻まれ、このキーを押すと文字コード「5C」が入力され、画面上には「5C」に対応する「¥」マークが表示されます。

ここで問題がややこしくなってくるのが、コンピュータの世界では結構バックスラッシュは使うのです。

分かりやすいのはWindowsのパス名でしょう。「c:\windows\system32」などと書きますね。元を辿るとこのパスの書き方はMS-DOSまでさかのぼります。米国などではこのパスはバックスラッシュで画面上に出てきますが、日本だと円マークで表示されてしまいます。その他にも、プログラミングの世界では特殊な文字を入力するとき(エスケープシーケンス)に頭にバックスラッシュを付けたりすることが良くあります。

でも日本ではバックスラッシュには円マークが割当たっているためバックスラッシュは使えません。これは困った…。MSやNECなどはMS-DOSやWindowsが普及し始めたときにこれを直そうとはせず、「パス名はバックスラッシュで記載」というふうにマニュアルに記載しました。まあしょうがないですね。だってJIS規格ですもん。規格に従わないわけにはいかないですからね。

しかしながら英語圏と日本語圏でコミュニケーションするときにこの問題は必ず付きまといますし、日本語圏に特化していないOS(or 環境、ソフト)ではそもそもJIS X 0201に従う必要性もメリットも何もないので、そういう環境ではキーボードの円マークを押すとバックスラッシュが表示されたりします。このあたりが非常に混乱をきたす結果となりました。

どうやってあるべき姿にするのか

バックスラッシュと円マークはまったく異なる文字ですが、コンピュータの中では同じとして扱われてしまっている。これはよくない。良くないので直そう、となるのですが一度制定して広まってしまった規格を変更するのは相当な苦労があります。

近年になって、世界中の文字を扱えるようにとUnicodeという文字セットが定義されました。そこには、当然のことながら円マークとバックスラッシュは異なる文字コードが割り当てられています。U+005Cというコードにはバックスラッシュが、U+00A5には円マークが割り当てられています。

加えて、日本語キーボードには円マークにもバックスラッシュ(キーボード右下のキーを見てください)もどちらも存在します。ということは、キーボードの円マークを押したときにはA5コードの文字を入力し、バックスラッシュを押したときには5Cコードを入力すればいいじゃん。やったじゃん。これでようやく問題解決だねっ。万々歳。…てことにはなりませんでした。

なぜならば、既に説明したように日本の中で円マークはすでにWindowsパスやエスケープシーケンスとして使える特殊な文字として説明され、市民権を得ているからです。キーボードの円マークを押したときに「U+00A5」に相当する文字が入力され、バックスラッシュを押したときに「U+005C」に相当する文字が入力されたどうなるでしょうか。今までパスやエスケープシーケンスを書くときに円マークを入力していたのに、それでは動かなくなってしまいます。

過去のソフト資産を使いつつ、Unicodeにも対応させるにはどうしたら良いか…と考えた結果、多く取られた方法としては「U+005Cに相当する文字フォントを円マークにすげかえる」という投げやり(?)な対応です。これは根本解決ではないですが、極力問題の発生を回避できそうな回答ではあります。

ただ、フォントですげかえてるだけなので、フォントを替えれば文字はバックスラッシュになったり円マークになったりします。書体を変えているのに文字まで変わるのはおかしくないでしょうか?私は許せません。

プログラミング界では初心者や新入社員から必ずと言って良いほど「バックスラッシュが入力できません」「バックスラッシュが円マークになってしまいます」などという質問が上がりますが、馬鹿馬鹿しい事この上ないと思います。バックスラッシュは円マークに見えているだけでバックスラッシュは正しく入力されている。入力できない(しにくい)のは円マークのほうです。

だから、このあたりの背景を知っている人は辟易としてくるのだけど、んじゃあどうすればいいのかというと明確な解決策は無く、それでも俺は許せないからと英語キーボードを使ったりすることになります。

正しいフォントを探せ

日本語キーボードで円マークに相当するボタンを押したときにバックスラッシュが入力されるのは100歩ゆずって我慢するとしても、バックスラッシュである文字を円マークで出すということは私は許せないです。許せないので、バックスラッシュをバックスラッシュとして表示してくれるフォントを探してみました。

Windows環境

Windows環境で良く見るフォントで確かめた所、日本語フォント(下記)は全てバックスラッシュを円マークとして表示していました。

  • MS ゴシック/明朝/P: 円マーク
  • HGP/HGS/HG系: 円マーク
  • メイリオ/Meiryo UI: 円マーク
  • Yu ゴシック: 円マーク

それどころか、どういうフォントマッピングになっているのか、ArialとかConsolasとかCentury, Times New Romanなどを選択しても円マークになります。ふざけているのでしょうか。そこまで気合を入れて欺いて何の意味があるのでしょうか。

その他フォント

その他、LinuxやAndroid系で良く目にするフォントについて調べてみました(※Windowsで使えないと言うわけでは無いです)。

  • Takao系フォント: 円マーク
  • Takao EX系フォント: バックスラッシュ
  • Droid sans Japanese: 円マーク
  • VL系: バックスラッシュ
  • モトヤマルベリ系: 円マーク
  • IPA系: 円マーク
  • IPA ex系: バックスラッシュ
  • さわらび系: バックスラッシュ
  • 梅 ゴシック系: バックスラッシュ
  • 梅 明朝系: 円マーク
  • 花園明朝: バックスラッシュ
  • UmePlus: 円マーク

バックスラッシュが多いですが、円マークも結構あります。

良くわからないのが梅ゴシックがバックスラッシュで梅明朝が円マークというところですね。なんでこうなったのか…。

というわけで、私のように円マークとバックスラッシュの違いが気になる人は上記のような正しいフォントを使いましょう。

正しい円マークはどうやって入力するの?

MS-IMEの場合はIME文字パッドから入力するしかないっぽいですね…。

Mozc(Google日本語入力)ならば「えん」で変換すると「円記号 機種依存文字」と出てきます。

まとめ

レガシー遺産を引きずって不都合が生まれる例として円マークとバックスラッシュを説明しました。インターネットやコンピュータの世界にはこういう本来あるべき姿ではないんだけど今さら規格は変えられないとしてだましだまし使っているものが多く、であるがためにセキュリティホールが生まれてハッキングに利用されたりしています。困ったもんですね。