エスケープシーケンスは、何から逃げているのか?
エスケープシーケンスは、何から逃げているのか?
答えは「コンテキスト(文脈)」かなぁ? どうやろ?
多くのプログラミング言語では、ダブルクオートで囲むことにより文字列リテラルを表記します。以下、コード例はphpです。
$a = "Hello, world!";
ここで、間に"wonderful"
を入れたい場合、"Hello, "wonderful" world!"
とは書けません。ダブルクオートで文字列リテラルを始めた場合、次に来るダブルクオートは「文字列リテラルの終わり」と解釈されるからです。それを避けて、「ただのダブルクオート」と解釈してもらうには、エスケープシーケンスを使います。
$b = "Hello, \"wonderful\" world!";
wonderful
の前後にある \"
がエスケープシーケンスです。バックスラッシュが、ダブルクオートを「文字列リテラルの終わり」という呪縛から逃し、「ただのダブルクオート」に戻しています。
Hello
とworld
の間で改行したい場合はどうでしょうか? そんな場合もエスケープシーケンスを使います。
$c = "Hello,\nworld!";
\n
がエスケープシーケンスですが、今回は、バックスラッシュが、「ただの平凡なn
」という日常から逃し、「改行コード(linefeed)」という特別な役割を与えています。
で、「エスケープ」とは、何からのエスケープなのか?
「ダブルクオートで囲まれた文字列リテラル」の中では、あるルールが適用されています。すなはち、
- ダブルクオートが来たら、文字列リテラルは終わる
- バックスラッシュが来たら、エスケープシーケンスが始まる
- それ以外の文字が来たら、それは、ただの文字
です。このルールが、「ダブルクオートで囲まれた文字列リテラル」のコンテキストです。そして、このコンテキストから逃してくれるのが、「エスケープ文字」であるバックスラッシュです。
- ダブルクオートの前にバックスラッシュを付けると、ただのダブルクオート(文字列リテラルは終わらない)
- バックスラッシュの前にバックスラッシュを付けると、ただのバックスラッシュ(エスケープシーケンスは始まらない)
- それ以外の文字の前にバックスラッシュを付けると、エスケープシーケンス(ただの文字ではない)
こんなもんで、どうかな?
余談ですが、両手でチョキを作って、おいでおいでしてみてください。それが「ダブルクオートで囲まれた文字列リテラル」です。
自らツッコミを入れると、
\\
自体がエスケープシーケンスです。
特に、実際のところ、「それ以外の文字の前にバックスラッシュを付けると、エスケープシーケンス」になるのは、ごく限られた文字だけです。エスケープシーケンスにならないケースでは、どう解釈されるのか? それは言語(や言語のバージョン)によって異なります。
たとえばphpの「ダブルクオートで囲まれた文字列リテラル」に関して言えば、12個のエスケープシーケンスが定義されています。これによれば、
"\c"
はエスケープシーケンスではありません。そしてecho "\c";
を実行したとき、最近のバージョンのphpでは、「バックスラッシュとc
」を出力します。これがもしC言語だったら、c
だけが出力されるはずです(違ったっけ?)。