\と¥の問題
バックスラッシュ\を入力する時に円記号¥に文字化けが起きる理由
プログラムのソースプログラムは(LaTeXのソースファイルやWebページのHTMLファイル等と同様に)テキストファイル(教科書ではテキスト形式と呼ばれています。プレーンテキスト(plain text)とも呼ばれることがあります)というファイル形式で書かれます。このテキストファイルはどのようなOSでも必ずサポートされている最も基本的なファイル形式であり、実体は1バイトを単位として文字コードで表現されたデータが先頭から順に並んでいるだけのファイルです。 その文字コードは歴史的にはさまざまなものがありましたが、次第にアメリカで定められたASCIIコードが主流になり、世界中で使われるようになりました。これが国際的な規格になったものがISO/IEC 646です。これらは7ビットの文字コードなので2の7乗つまり128種類の文字が表現でき、アルファベットA-Zおよびa-z、数字の0-9およびいくつかの記号を表現するために使われることになりました。プログラムも基本的にこのISO/IEC 646で表現可能な文字、つまり英語のアルファベットと数字、ASCIIで表現可能な記号で記述することになり、Cを含む多くのプログラミング言語はその原則に沿って設計されています(ASCIIで表示不可能なプログラミング言語の代表としてAPLが挙げられます)。 ところで米国の国内規格であるASCIIコードが国際規格であるISO/IEC 646になる際に、各国の事情に応じていくつかの記号の意味を変えて良いことになりました(現実は既に各国がASCIIを拡張変更しはじめていた実情を追認した面があるのですが)。このため、ISO/IEC 646には、ASCIIコードと互換性がなく、国によって違う文字に置き換わってしまう(いわゆる文字化けが発生する)文字がいくつか存在します。そのような文字がプログラミング言語に使われていると、ソースプログラムの文字化けが発生するのです。
ISO/IEC 646日本版(JIS X 0201・教科書では単にJISコードと呼ばれているもの)はASCIIコードと2個所だけ文字が変わっていますが、そのうち1つがバックスラッシュ\の円記号¥への置換えです。バックスラッシュ\はCをはじめとする多くのプログラミング言語で多用するのでよく問題になります。この文字はASCIIコードのうち2進法で1011100、10進法で92、16進法では5C(C記法で0x5c)にあたる文字ですが、Windowsの日本語環境では、英語用のフォントではバックスラッシュ\が、日本語用のフォントでは円記号¥が表示されるという現象が発生します。ですがコンパイラはテキストファイルであるソースファイルのデータだけを見てプログラムをコンパイルするので、人間にとってその文字がどう見えているかの違いを気にしません。0x5cというデータがあればそれはCの文法上でいうバックスラッシュ\だと信じてコンパイルを続けます。 結論として、Windowsのように、バックスラッシュ\を表すASCIIコード0x5cが円記号¥に文字化けする環境では、(仕方ないので)バックスラッシュ\の代わりに円記号¥を使ってプログラムを書きましょう。
なお余談ですが、日本のWindows環境においてファイルのパス名の区切り文字が円記号¥なのは、本来バックスラッシュ\だったのに日本の環境では円記号¥になってしまうものがそのまま浸透したものです。同様の問題がある国に韓国があります。韓国版ISO/IEC 646では0x5cはウォン記号₩なので、韓国語版Windowsではパス名の区切り文字に₩が使われています。
バックスラッシュ\の入力法
バックスラッシュ\キーは以下のように入力します。
Windows環境でかつ日本語キーボードの場合はキーボードの右下端、右SHIFTキーの左側にバックスラッシュ\キーがあります。これを(IMEをオンにせずに)押せばバックスラッシュ\が入力されるはずです。これが円記号¥に見えていたとしても文字コードは0x5cのはずです。
https://gyazo.com/450811a17eaefb14aec939aea0edfc0e
なおこのバックスラッシュ\キーは大昔は存在しませんでした(バックスラッシュ\という文字自体が日本語環境にはなかった)ので、世の中の多くの人は代わりにキーボード右上端の円記号¥キーを使ってバックスラッシュ\を入力しています。ですがこれはオススメしません。LinuxやChromebookなどの環境では円記号¥キーは0x5cを入力するためではなく、0xa5という別の文字コード(ISO/IEC 8859-1と呼ばれる文字コードでは円記号を表します)を入力するために使われており、バックスラッシュ\と円記号¥は明確に別物として扱われます。このような環境でつい癖でバックスラッシュの入力のために円記号¥キーを押すと事故の元になります。講義の演習では、Windows Subsystem for Linux環境を併用しますので、\と¥は別物として扱える環境であり、設定によっては円記号¥キーを使ってバックスラッシュ\を入力しようとするとトラブルのもとになります。 なお最近のWindows 10やWindows 11では、コマンドプロンプトに代わりWindows Terminal(日本語環境では「ターミナル」)と呼ばれる端末エミュレータが利用できます。この環境では0x5cは(フォントさえサポートしていれば)バックスラッシュ\として表示されます。
macOS環境でかつキーボードが日本語キーボードの場合はバックスラッシュキー\がありません。さらに困ったことに円記号キー¥は0x5cではなく0xa5を入力するためのものなのでバックスラッシュ\の代わりになりません。なのでmacOSでは\と¥は別物で文字化けしないのでちゃんとバックスラッシュ\を入力してプログラムを書かねばなりません。日本語キーボードでバックスラッシュを入力する場合は、Option⌥キーを押しながら円記号¥キーを押すと良いです。
なお毎回Option⌥キーを押すのが面倒な人は、設定で単に円記号¥キーを押すとバックスラッシュ\が入力されるようにできます。たとえばここを参考にしてください。 Linux環境(PCにUbuntu等を導入した環境やChromebookの環境)およびWindows内でLinuxを動かすWindows Subsystem for Linux環境ではもう少し状況は複雑です。状況によって以下の2つの場合があるようです。いずれにせよバックスラッシュ\キーを使って入力するのが安全です。
バックスラッシュ\キーを押しても円記号¥キーを押しても0x5cが入る。フォントによって表示は\であったり¥であったりする。
バックスラッシュ\キーを押すと0x5cが入り、円記号¥キーを押すと0xa5が入る。見かけはフォントによって、前者が\で後者が¥である場合もあるし、両方が見かけ上¥になり区別がつかないこともある(これが一番困るのでフォントを変えた方が良い)。