2017-03-27

エスケープシーケンス

0 件のコメント

 ちょいと Java の勉強をしておこうとスッキリわかるJava入門という参考書を買って学び始めたところ、初っ端でいきなり引っかかったので、その備忘録。

  
    public class Main {
      public static void main(String[] args) {
        System.out.println("私の好きな記号は二重引用符 (¥") です");
      }
    }
  

 上記のコードをコンパイルし実行すると

  私の好きな記号は二重引用符 (") です

 と実行結果で出るはずなのだが、コンパイルの時点で下記のエラーが出る。

  Main.java:3: エラー: ';'がありません
    System.out.println("私の好きな記号は二重引用符 (¥") です");
                                          ^
  Main.java:3: エラー: 文字列リテラルが閉じられていません
    System.out.println("私の好きな記号は二重引用符 (¥") です");
                                            ^
  Main.java:3: エラー: 文ではありません
    System.out.println("私の好きな記号は二重引用符 (¥") です");
                                          ^
  エラー3個

 何度見直しても変わりがないので、うんうん唸りながら検索して調べていた。するとこんな記事を見つけた。エスケープシーケンスの記号が「¥(円マーク)」ではなく「\(バックスラッシュ)」で書いてある。他にもあちこち見てみたが、円マークで書かれていたりバックスラッシュで書かれていたりまちまちである。もしかしたらバージョンに拠って違うのだろうか。その辺りに焦点を絞って調べると、今度はこういう記事を見つけた。ページから一部抜粋。

  プログラムでエスケープ文字として使われるものは、ASCIIコードで0x5cのものですが、
  Windowsでは円マークです。

  このコードには、Mac( や欧米フォント)ではバックスラッシュがわりあてられています。
  # 正確に言うとややこしいので、詳しくは検索でもしてください。

  半角の円マークには別のコードが割り当てられているので
  バックスラッシュ"は、"の文字そのものの意味。
  円マーク" は、そのまま 円マークの後に"で文字列が終了、の意味になります。

 まさか機種に拠る仕様だとは思わなかった。そう、私が使用しているのは macOS である。試してみると確かに成功した。つまり macOS 書く場合の正しいコードは下記の通りである。

  
    public class Main {
      public static void main(String[] args) {
        System.out.println("私の好きな記号は二重引用符 (\") です");
      }
    }
  

 今のところ参考書にはその旨の但し書きはない。もしかしたら後で説明しているのかも知れないが、出来れば冒頭で説明しておいて欲しい。

0 件のコメント :

コメントを投稿