エスケープシーケンスは、何から逃げているのか?

答えは「コンテキスト(文脈)」かなぁ? どうやろ?


多くのプログラミング言語では、ダブルクオートで囲むことにより文字列リテラルを表記します。以下、コード例はphpです。

$a = "Hello, world!";

ここで、間に"wonderful"を入れたい場合、"Hello, "wonderful" world!"とは書けません。ダブルクオートで文字列リテラルを始めた場合、次に来るダブルクオートは「文字列リテラルの終わり」と解釈されるからです。それを避けて、「ただのダブルクオート」と解釈してもらうには、エスケープシーケンスを使います。

$b = "Hello, \"wonderful\" world!";

wonderfulの前後にある \" がエスケープシーケンスです。バックスラッシュが、ダブルクオートを「文字列リテラルの終わり」という呪縛から逃し、「ただのダブルクオート」に戻しています。


Helloworldの間で改行したい場合はどうでしょうか? そんな場合もエスケープシーケンスを使います。

$c = "Hello,\nworld!";

\nがエスケープシーケンスですが、今回は、バックスラッシュが、「ただの平凡なn」という日常から逃し、「改行コード(linefeed)」という特別な役割を与えています。


で、「エスケープ」とは、何からのエスケープなのか?

「ダブルクオートで囲まれた文字列リテラル」の中では、あるルールが適用されています。すなはち、

  • ダブルクオートが来たら、文字列リテラルは終わる
  • バックスラッシュが来たら、エスケープシーケンスが始まる
  • それ以外の文字が来たら、それは、ただの文字

です。このルールが、「ダブルクオートで囲まれた文字列リテラル」のコンテキストです。そして、このコンテキストから逃してくれるのが、「エスケープ文字」であるバックスラッシュです。

  • ダブルクオートの前にバックスラッシュを付けると、ただのダブルクオート(文字列リテラルは終わらない)
  • バックスラッシュの前にバックスラッシュを付けると、ただのバックスラッシュ(エスケープシーケンスは始まらない)
  • それ以外の文字の前にバックスラッシュを付けると、エスケープシーケンス(ただの文字ではない)

こんなもんで、どうかな?


余談ですが、両手でチョキを作って、おいでおいでしてみてください。それが「ダブルクオートで囲まれた文字列リテラル」です。