エスケープシーケンス

Java

以下ののエスケープが使える。

\b
0x08
\t
0x09 (タブ)
\n
0x0a (LF)
\f
0x0c
\r
0x0d (CR)
\"
"
\'
'
\\
\
\ooo
8進数1桁から3桁で文字を表現 (U+0000 〜 U+00FF までしか表現できない)
\uhhhh
Unicodeエスケープといい、16ビットのUnicodeを16進数表記4桁で表現。 正確には文字列で使えるエスケープではなく、ソースコード中のどこでも使えるエスケープシーケンスである。 U+10000以上はサロゲートペアを使う必要がある。

Scala

ダブルクオーテーション1つの文字列リテラル "..." では Javaとまったく同じエスケープシーケンスを使える。

Unicodeエスケープが文字列リテラルにかぎらずソースコード中の任意の場所で使えるのもJavaと同じ。

ダブルクオーテーション3つの文字列リテラル """...""" ではUnicodeエスケープ以外のエスケープが効かない。この種類の文字列リテラルはJavaにはない。

PHP

シングルクオーテーションの文字列リテラル '...' は、エスケープが必要になるのは '\ のみになる。'\n' などと書いても \n そのものになって改行にはならない。つまり ' で囲まれている場合、 \ の次に ' または \ 以外が来ても特別な意味にはならない。

echo 'aaa\nttt'; // => aaa\nttt // \n は改行にはならない
echo 'aaa\'ttt'; // => aaa'ttt
echo 'aaa\ttt'; // => aaa\ttt // \t はタブにはならずに \t のまま
echo 'aaa\\ttt'; // => aaa\ttt // \\ は \ になる

ダブルクオーテーションの文字列リテラル "..." は、以下のエスケープが使える。

\0
0x00 (Null文字)
\t
0x09 タブ
\n
0x0a LF
\f
0x0c
\r
0x0d CR
\e
0x1B ESC
\$
$変数展開を回避するために $ はエスケープが必要。
\"
"
\\
\
\ooo (8進数1桁〜3桁)
ASCII文字を8進数表記1桁〜3桁で表現
\xhh (16進数1桁〜2桁)
ASCII文字を16進数表記2桁で表現。8ビットを超える文字を直接16進数で表記することはできない。 Unicodeエスケープ参照。

文字列 | PHP Manual
http://php.net/manual/ja/language.types.string.php

Python

シングルクオーテーションの文字列リテラル '...' もダブルクオーテーションの文字列リテラル "..." も同じエスケープが使える。三重引用符(トリプルクオート、シングルクオーテーション3つまたはダブルクオーテーション3つ)の文字列リテラル '''...''', """...""" も同じ。

', ", ''', """ の直前に r または R をプレフィックスとしてつけると、 raw文字列というものになり、バックスラッシュによるエスケープシーケンスが無効になる。ただし、\' または \"'" になったりせずに \'\" のままだが、文字列リテルの終端の意味だけはエスケープされる。結果的にraw文字列はバックスラッシュで終わる文字列を書くことができない。このようにraw文字列はPHPの '...' とは少しだけ挙動が異なる。

Python2でur(大文字小文字区別なく)を付けると、raw文字列であっても \uhhhh と \Uhhhhhhhh のエスケープシーケンスだけは使える。

\0
0x00 (Null文字)
\a
0x07 (ビープ音)
\b
0x08 (バックスペース)
\t
0x09 (タブ)
\n
0x0a (LF)
\v
0x0b (垂直タブ)
\f
0x0c (改ページ)
\r
0x0d (CR)
\"
"
\'
'
\\
\
\oooo
ASCII文字を8進数表記3桁で表現
\xhh
ASCII文字を16進数表記2桁で表現
\uhhhh
16ビットまでのUnicodeを16進数表記4桁で表現。 Python2ではUnicode文字列リテラルの中でのみ使用可能。 Unicode文字列リテラルとは、u"..." または ur"..." のように u または ur を前置した文字列リテラルのこと。 Python2のそれ以外の文字列ではエスケープされずそのまま文字列になる。 Javaと違い、\uhhhh は文字列の中でのみ使えるエスケープシーケンスである。 16ビットを超える拡張領域のUnicodeはサロゲートペアを使うのではなく下の \U00hhhhhh を使う。
\U00hhhhhh
Unicodeを16進数表記8桁で表現。 Unicodeは最大で21ビットなので、最初の2桁は常に0にせざるを得ない気がする。 Python2ではUnicode文字列リテラルの中でのみ使用可能。 Python2のそれ以外の文字列ではエスケープされずそのまま文字列になる。

文字列の中でバックスラッシュ(\)を書いて改行すると、次の行に文字列が継続され、バックスラッシュと改行は文字列の中にはなかったことになる。

エスケープシーケンスとして成立しない不適切な \ があると、それはエスケープされずにそのまま文字列の一部になる。

三重引用符(トリプルクオート) '''...''', """...""" での文字列は、改行や三重でない引用符 ', " はエスケープ処理しなくてもそのまま使える。

文字列リテラル | Python 2.7 documentation
http://docs.python.jp/2/reference/lexical_analysis.html#strings

文字列リテラル | Python 3 documentation
http://docs.python.jp/3/reference/lexical_analysis.html#string-and-bytes-literals

Ruby

ダブルクオーテーションの文字列リテラル "..." は、以下のエスケープが使える。シングルクオーテーションの文字列リテラル '...' ではエスケープが効かない。

\t
0x09 タブ
\n
0x0a LF
\f
0x0c
\r
0x0d CR
\e
0x1B ESC
\a
0x07 ベル
\b
0x08 バックスペース
\s
0x20 スペース
\#
#
\"
"
\\
\
\ooo (数字1桁〜3桁)
ASCII文字を8進数表記1桁〜3桁で表現
\xhh (数字1桁〜2桁)
ASCII文字を16進数表記2桁で表現
\uhhhh
16ビットのUnicodeを16進数表記4桁で表現。 Javaと違い、\uhhhh は文字列の中でのみ使えるエスケープシーケンスである。 16ビットを超える拡張領域のUnicodeはサロゲートペアを使うのではなく下の \u{} を使う。 Unicodeエスケープ参照。
\u{hhhh}
16ビットのUnicodeを16進数表記2〜6桁で表現。 {} の中はスペースかタブ区切りで複数の文字を表現できる。 Unicodeエスケープ参照。

他の言語と違って、ダブルクオーテーションの文字列リテラル '...' とシングルクオーテーションの文字列リテラル "..." のどちらでも途中に改行を直接入れることができる。ただし "..." の場合、改行の直前にバックスラッシュ(\)を置くと、バックスラッシュと改行がなかったことになる。

p "あい
うえお"
# => "あい\nうえお"

p 'あい
うえお'
# => "あい\nうえお"

p "あい\
うえお"
# => "あいうえお"

p 'あい\
うえお'
# => "あい\\\nうえお"

# バックスラッシュの後に空白があると
p "あい\ 
うえお"
# => "あい \nうえお"

# バックスラッシュの後に空白があると
p 'あい\ 
うえお'
# => "あい\\ \nうえお"

バックスラッシュ記法 | Ruby 2.1 リファレンスマニュアル
http://docs.ruby-lang.org/ja/2.1.0/doc/spec=2fliteral.html#backslash

Perl

ダブルクオーテーションの文字列リテラル "..." または qq/.../ は、以下のエスケープが使える。シングルクオーテーションの文字列リテラル '...' または q/.../ ではエスケープが効かない。

文字列リテラル以外にも外部コマンドを実行するバッククオート `...` または qx/.../ でも以下のエスケープが使える。

シングルクオーテーションの文字列リテラル '...' は、エスケープが必要になるのは '\ のみになる。'\n' などと書いても \n そのものになって改行にはならない。つまり ' で囲まれている場合、 \ の次に ' または \ 以外が来ても特別な意味にはならない。

\a
0x07 ベル
\b
0x08 バックスペース
\t
0x09 タブ
\n
0x0a LF
\f
0x0c
\r
0x0d CR
\e
0x1B ESC
\$
$変数展開を回避するために $ はエスケープが必要。
\@
@変数展開を回避するために @ はエスケープが必要。
\cc
\c のあとに続く文字によって制御文字を表現。文字がアルファベットの場合大文字小文字を区別しない。
\c@: \x00
\cA: \x01
\cB: \x02

\cZ: \x1A
\c[: \x1B
\c\: \x1C
\c]: \x1D
\c^: \x1E
\c_: \x1F
\c?: \x7F
\o{ooo}
Unicode文字を8進数で表現。これはPerl5.14以降の機能
\ooo
Unicode文字を8進数で表現
\xhh
ASCII文字を16進数表記1桁または2桁で表現
\x{hhhh}
Unicodeの文字をコードポイント16進数表記6桁までで表現
\N{name}
Unicodeの文字をUnicode文字名で表現
\N{U+hhhh}
Unicodeの文字をコードポイント16進数表記6桁までで表現

\x1C を表す \c\ の2つ目のバックスラッシュはさらにエスケープする必要はなく、単独でよいのだが、その後に続く文字をエスケープする場合があるみたいで、よくわからない。

Pythonにもある垂直タブ0x0bのための特別なエスケープシーケンスはない。

" で囲んだ文字列の中では @ も配列として展開されてしまうので、メールアドレスを文字列で表現したい場合には、' を使うのが無難。

その他にも特別な意味のあるエスケープシーケンスとして \l, \u, \L, \U, \F, \Q, \E がある。

クォートとクォート風の演算子 | perldoc.jp
http://perldoc.jp/docs/perl/5.18.1/perlop.pod#Quote32and32Quote-like32Operators

sh (シェルスクリプト)

いくつかの記号はシェルで特別な意味を持つので \ でエスケープが必要。

" で囲めば、エスケープが必要になるのは ", $, \, ` のみになる。

' で囲めば、エスケープ処理が不要になるが、 ' を含めることができなくなる。どうしても含めたい場合は以下のようにする。

echo 'o'\''clock'
# => o'clock

いったん、''の文字列を閉じて、それに続けて単独の ' を引用符と区別するためにエスケープを前置して入れ、その後にまた続けて後続の文字列を書く。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。