

エスケープ文字についてよくわからないのですが、

バックスラッシュなどを表現する場合に「¥¥」のように表現しているのですが、  
「エスケープ文字」としてきまった文字があるのでしょうか？

<http://home.a00.itscom.net/hatada/c01/escape01.html>  
ここなどをみると「C言語のエスケープ文字」とあり、  
言語によって異なるものなのでしょうか？


CC BY-SA 4.0
2019-09-19T00:44:30.917
59143
2019-09-19T02:21:58.947
12842
question
java ruby bash
エスケープ文字とは


異なります。

Javaに関しては、ここの「Escape Sequences」のセクションに記載されています。

[The Java™ Tutorials -
Characters](https://docs.oracle.com/javase/tutorial/java/data/characters.html)

「"Escape Sequences" ruby」のようなキーワードでググってみれば、他の言語についても分かると思います。


CC BY-SA 4.0
2019-09-19T01:05:22.557
59145
2019-09-19T01:10:26.493
2019-09-19T01:10:26.493
21092
21092
59143
answer


エスケープ文字は`\`とは限らず言語ごとに異なります。

一例として[Windowsのバッチファイル](https://en.wikibooks.org/wiki/Windows_Batch_Scripting#Quoting_and_escaping)の場合、

  * `<`、`>`、`|`、`&`、`!`などの記号は`^`でエスケープします。`^`自身も`^`でエスケープします。
  * 変数を表す`%`は`%%`と重ねることでエスケープされます。


CC BY-SA 4.0
2019-09-19T01:55:54.290
59147
2019-09-19T01:55:54.290
4236
59143
answer


エスケープ文字およびエスケープシーケンスは、各種言語において「文字」あるいは「文字列」の中で、ソースコードの見た目と違う機能を引き出す処理と考えていいでしょう。

んで [c](/questions/tagged/c "'c' のタグが付いた質問を表示") も [java](/questions/tagged/java
"'java' のタグが付いた質問を表示") も [python](/questions/tagged/python "'python'
のタグが付いた質問を表示") あるいは [ruby](/questions/tagged/ruby "'ruby' のタグが付いた質問を表示")
も、エスケープ文字として逆斜線文字を採用し、エスケープシーケンスも似通っています（同一でないので要注意：各言語の仕様書なり解説書なり参照のこと）何か理由なり根拠なりありそうです。

これは妄想ですが、各種言語は、古くからある [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
言語のユーザーを自分の陣営に取り込みやすくするため、移行中の [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
ユーザーが混乱しないよう [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
言語に似せたエスケープ文字（エスケープシーケンス）を採用したと個人的には思います。なので、エスケープ文字として「決まった文字」があるわけではないけれど、わざわざ独自の仕様を採用して皆を混乱させるくらいならほぼ同じものにしてしまおうという暗黙の合意があったのではないか、と考えることはできそうです。

そういう事情に関係ない `cmd.exe` や `PowerShell` のエスケープは文字もシーケンスも異なります。

* * *

[c](/questions/tagged/c "'c' のタグが付いた質問を表示") / [c++](/questions/tagged/c%2b%2b
"'c++' のタグが付いた質問を表示")
においてはエスケープシーケンスに似て非なる「トライグラフ」というのがあり、文字（列）リテラルでないところでもソースコード上に「クエスチョンマーク２つ＋特定文字」があると、別の文字に読み替えるという変態な機能が盛り込まれています（いやもちろん採用された根拠はきっちりあるのですが）。

[code]

    ??=define arraycheck(a,b) a??(b??) ??!??! b??(a??) // と記述すると
    #define arraycheck(a,b) a[b] || b[a] // と読む
    
[/code]

これを知らないプログラマが [c](/questions/tagged/c "'c' のタグが付いた質問を表示") /
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") でうっかり `??`
を書いてしまうとバグらせてしまうことがありうるので要注意です。  
<https://www.jpcert.or.jp/sc-rules/c-pre07-c.html>

これのせいで [c](/questions/tagged/c "'c' のタグが付いた質問を表示") /
[c++](/questions/tagged/c%2b%2b "'c++' のタグが付いた質問を表示") のエスケープシーケンスには `\?`
が存在します（ほかの言語には無いはず）

[gcc](/questions/tagged/gcc "'gcc' のタグが付いた質問を表示") では標準で無効、コンパイルオプション
`-trigraphs` で有効化したら使えるようになる機能なうえに `-Wtrigraphs` で警告されるほど嫌われていました。また
[c++17](/questions/tagged/c%2b%2b17 "'c++17' のタグが付いた質問を表示") では廃止になっちゃいました。


CC BY-SA 4.0
2019-09-19T02:21:58.947
59149
2019-09-19T02:21:58.947
8589
59143
answer