¥と\。
今朝、友人の娘さんでとある女子大に通う人から、「C言語について教えて欲しい」とメールが届きました。
なんでも、テキスト通りに入力したのにコンパイルが通らずにエラーが出るとのことで、テキストの該当ページの写真と実際に入力したコードの写真が添付してありました。
写真を見ると、まだ入門の中でも始めの方で、制御文についてのサンプルプログラムでした。見たところ、その人が入力したコードには間違いがありません。敢えて言うならプリプロセッサの宣言文で、スペースが抜けていたくらいでした。
実際に豚のPCでもコードを入力してみて、コンパイル・実行出来るのを確認した上で、#includeの後にスペースが抜けている旨を指摘して、その場は終わりました。
しかし数分後、やっぱりエラーが出てしまうとのメールが。エラーコードを聞くとどうやらmain関数の宣言に問題があるという謎のエラーでした。
もしかして開発環境による違いかも知れないと思い、コンパイラの種類を聞いてみました。「iPadでコードを書いている」という事はわかりましたが、コンパイラの種類は全くわからずでした。
でもここで、豚は気付いていなければいけなかったんです。数日前に別の友人からのメールで、WindowsとLinux系の文字コードの違いについて教えて貰っていたのを……。
その娘さんが使っていたテキストは、恐らくWindowsでの開発環境を前提として書かれていたんでしょう。改行のエスケープシーケンスのコードが¥nとなっていました。当然豚の環境では正常に動作します。でも、その娘さんが使っていたのはiPad。¥マークは\とコードに書かなくてはいけません。いや、寧ろわざわざ¥マークをどうやって入力していたのか謎は残ります。
暫くしてその娘さんから「¥マークを\に変えたら動いた!」とメールが届きました。どうやってその事がわかったのか、丸2日間ほど悩んでも動かなかったと聞いていましたが、自力で解決したようでした。もしかすると豚が送ったメールに書いたコードが相手のスマホに届いた段階で、¥が\に文字化けしていたのかも知れません。
「テキストの誤植だ」と書かれていたので、「テキストは間違っていません。今は取り敢えずWindows系は¥n、MacやLinux系は\nだと覚えておいて下さい。」と返信して、無事に解決しました。
しかしどう考えても、iPadでC言語を教えるのに¥マークと\の違いも説明せずに学生に自主学習をさせるほうがおかしいでしょう。学校は一流の4年制女子大ですが、教官は余り優秀では無いのかも知れません。(失礼!)
まぁ豚もiPadと聞いて、すぐにこの件を思い出せなかった時点で同じ穴の狢ですが……。
午後2時55分
¥と\の文字コード0x5C番地の問題
macOS、iOSでは、「¥」円記号(00A5)と「\」バックスラッシュ(005C)は別の文字コード番号に
割り当てているようです。
30数年前にMS-DOSの16ビットパソコンで、追加フォントの販売で欧文フォント(英語フォント)をインストールして
まずクレーム対応して「¥」が出ないとの問い合わせ多かったですから。
メールでメール本文か、テキストファイル.txtの添付ファイルで
Windows宛とiOS端末宛に「¥」入りのソースコード送って見て
文字の表示の違い確認してくださいね。
バックスラッシュ0x5C番地を入力したい
https://www.relief.jp/docs/001280.html
日本語Windows環境でも、欧文フォント(英語)では、
バックスラッシュ「\」0x5C番地は表示できるようです。
バックスラッシュと円記号 (¥) 0x5C番地の問題について
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B9%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5
Mac OS では、バージョン 7.1〜9.x で主流だった日本語文字コード MacJapanese において、0x5C に円記号が、0x80 にバックスラッシュ記号がそれぞれ別々のコードポイントに存在している
円記号
https://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98%E5%8F%B7
バックスラッシュは、MS-DOSではディレクトリ名を区切る記号として、C言語なら文字列の中で特殊文字を意味する記号として扱われるなど、ISO/IEC 646 で未定義の文字を、各種オペレーティングシステムやプログラミング言語、その他のソフトウェアで制御コードとして使用するという不適切な仕様が一般化してしまった。
日本語用の文字コードにはバックスラッシュが存在せず、同じ0x5C番地に円記号が割り当てられているのであるが、これらのソフトウェアでは0x5C番地の文字がエスケープ文字として扱われるようにされていたため、「日本語用文字コードでは円記号が同等のエスケープ文字として解釈される」ことになった。
一方macOSではこのようなグリフ変換を行ったフォントは搭載しておらず、005Cはバックスラッシュが表示される。一方、円記号のキーでは初期設定では00A5が入力されるが、設定でバックスラッシュに変更が可能である。iOSもこの仕様に準じており、円記号(00A5)とバックスラッシュ(005C)は別の文字としてきちんと表示され、ソフトウェアキーボードでは双方が容易に入力できる。Androidではメーカーが採用するフォントにより表示環境は異なるが、概ねiOSと同様であり、主要な日本語キーボードでは2つの記号の双方の入力が可能となっている。
なるほど、流石は魔神氏、勉強になります。
ここまで深く掘り下げて勉強したことはありませんでした。
豚もまだまだ知らないことだらけですね……。
あれ? と言う事は、英語版WindowsでCのコードを書くときには、¥記号は\で記述しなければいけないのかな?
豚は洋書の解説書を読んだことが無いのでわからないのですが、もしそうだとしたら大変な思い違いをしていることになりますね。