コンピューティングや通信において、エスケープ文字エスケープもじ英: escape character)とは、それに続く文字について別の解釈をすることを示す文字である。エスケープ文字は、メタ文字の一種である。通常、何がエスケープ文字であるか、またはそうでないかは、文脈に依存する。

定義

エスケープ文字は多くのプログラミング言語、データフォーマット、通信プロトコルの文法の一部である。エスケープ文字の目的は、エスケープシーケンスと呼ばれる一連の文字列を開始することである。エスケープ文字に続く文字は、エスケープ文字がない時とは別の解釈をしなければならない。エスケープ文字自体は、単独では意味を持っていない。エスケープシーケンスは、エスケープ文字を含めて2文字以上である。

エスケープシーケンスには2つの機能がある。一つは、アルファベットでは表すことができない構文的な実体、例えば装置へのコマンドや特別なデータをコード化することである。もう一つは、文法上特別な意味を持つ文字を、その文字自体として表現することである。後者の場合、そのエスケープシーケンスは「ダイグラフ」や「トライグラフ」と呼ばれ、エスケープ文字と表示したい文字からなる。

制御文字

一般に、エスケープ文字は装置制御文字の一種でなく、逆もまた然りである。制御文字を非図形文字、すなわち出力装置(例えば、プリンタやテキスト端末)にとって特別な意味を持つものとして定義するならば、その装置にとってはあらゆるエスケープ文字は制御文字である。しかし、プログラミングで使用されるエスケープ文字はバックスラッシュ (\) やパーセント記号 (%) などの図形文字なので制御文字ではない。逆に、(全てではないが)ほとんどのアスキー制御文字は、単独で何らかの制御機能を持っているため、エスケープ文字ではない。

多くのプログラミング言語では、エスケープ文字は制御文字を参照するエスケープシーケンスも作る。例えば、改行のエスケープシーケンスは \n である。

ASCIIエスケープ文字

ASCIIエスケープ文字は制御文字の一種で、十進数で27、十六進数で1B16に割り当てられている。キャレット記法では ^[ と表され、Unicodeでは制御文字の図形表現として ␛ (U 241B) が定義されている。この文字は多くの出力装置で、「コントロールシーケンス」または「エスケープシーケンス」と呼ばれる文字列の開始文字として使われている。一般的に、それに続く文字が通常の文字ではなくコントロールシーケンスとして解釈されるということを装置に伝えるために、エスケープ文字が最初に送られる。エスケープ文字に続けて詳細な動作を指定する1文字以上の文字が送られた後、装置は通常の文字として解釈するモードに戻る。例えば^[と表示可能文字からなる文字列 ^[2;10H は、DEC VT102端末においてカーソルを画面上の2行目10桁目へ移動させる。これは後にANSI X3.64標準が対象とするANSIエスケープコードへと発展した。ヒューレット・パッカードのPrinter Command Language (PCL) も各コマンドがエスケープ文字から始まっていた。

「エスケープ文字」という用語が最初に使われたのは、ボブ・バーマーによるIBMの技術書の中である。エスケープシーケンスの仕組みを発明し、ASCII文字コードセットにエスケープ文字を加えることを提案したのも彼である。

Escキー(エスケープキー)は、PCのキーボード上にはあるが、ASCIIによる文字通信を主な目的としていないPDAなどの装置のキーボードには見られない。DEC VT220シリーズは専用のEscキーを備えておらず、その代わりにキーパッドの上のキーの1つを使った。1970年代から1980年代のユーザインタフェースでは、エスケープ文字のためにこのキーを使うことは珍しくなかったが、最新のデスクトップ・コンピュータにおいて、そのような使用はされなくなった。時々、EscキーはAltModeキーと同一視される。Escキーを使用しなくても、コントロールキーと[を同時に押下することでもエスケープ文字のコードを発生させることができる。

プログラミングとデータフォーマット

現代の多くのプログラミング言語では、文字列リテラル(string literal)の開始および終了を表す区切り文字として、ダブルクォート 2216 (") を使用している。そのため、ダブルクォートそのものを文字列リテラルに含めることはそのままではできないので、バックスラッシュ 5C16 (\) をエスケープ文字として使用する(日本語環境ではオペレーティングシステムおよびフォントによっては5C16は円記号として表示されることがあるが、以下では単にバックスラッシュと書く)。文字列リテラルの中で \" と書くと " と解釈される。また、十六進数のASCIIコードを使って \x22 と書くこともできる。またシングルクォート 2716 (') を文字リテラルの区切り文字として使用することもあり、文字リテラルの中でシングルクォートを使用する場合は同様にエスケープが必要となる。

C言語、C 、Java、C#などでは、上記の2つの方法とも使用できる。PostScriptやマイクロソフトのRich Text Formatもバックスラッシュによるエスケープを使用する。

C/C /Javaの文字列リテラルでは八進数のASCIIコードを使って\42\042と書くこともできるが、C#ではサポートされない。

PythonやRubyではダブルクォートで囲んだ"x"もシングルクォートで囲んだ'x'も文字列である。C系言語で使われるエスケープシーケンスもサポートする。なお、Pythonでは"\n"'\n'も改行文字からなる長さ1の文字列を意味するが、Rubyでは"\n"は改行文字からなる長さ1の文字列を、'\n'\nからなる長さ2の文字列を意味する。

printfの書式文字列ではパーセント記号%が特殊な意味を持つエスケープ文字であり、%自体を出力するためには%%とする。

quoted-printableでは等号 (=) をエスケープ文字として使用する。

URLやURIでは、特別な意味を持つ文字や非ASCIIの文字を表すのにパーセント記号 (%) をエスケープ文字としたパーセントエンコーディングを使用する。アンパサンド (&) は、SGMLやそれから派生したHTML・XMLなどにおいてエスケープ文字として扱われる。

JavaScript

JavaScriptでは \ をエスケープ文字として使用する。

\v\0 はJSONでは使用できない。

通信プロトコル

Point-to-Point Protocol (PPP) では、7D16のオクテット(ASCIIでは})をエスケープ文字として使用する。すぐ後に続くオクテットは2016とのXORを取ってから上位のプロトコルへ送られる。これは、7D16自体と、PPPでフレームの開始・終了を表す7E16について、上位のプロトコルからそれらのオクテットをPPPでカプセル化して送信するよう要請があったときに適用される。上位のプロトコルからの要請が7D16の場合、送られるシーケンスは「7D 5D」となり、7E16の場合は「7D 5E」となる。

Bourne Shell

Bourne Shell (sh) では、アスタリスク (*) と疑問符 (?) がワイルドカードとして使用される。エスケープ文字を使わないと、*はカレントディレクトリの全てのファイルのファイル名に展開される。"*"というファイル名を指したい場合は、バックスラッシュ(\)を前につける。例えば、バックスラッシュをつけない場合とつけた場合で、以下のように動作が変わる。

Windowsのコマンドプロンプト

Windowsのコマンドプロンプト(cmd.exe)では、特別な意味を持つ文字 (&|()<>^) のためのエスケープ文字としてキャレット (^) を使用する。DOSのコマンドラインインタプリタ(COMMAND.COM)はWindowsのコマンドプロンプトと似たような文法を持つが、このエスケープ文字には対応していない。

例えば、コマンドプロンプトで「x」と表示させようとして次のように記述しても、意図どおりにはならない。

そこで、キャレットでエスケープして次のようにする。

関連項目

  • C言語のエスケープシーケンス
  • 傾いた楊枝症候群
  • ストロッピング

エスケープ文字は、以下のものとは異なる。

  • エスケープシーケンス
  • Escキー

脚注

注釈

出典

外部リンク

  • Escape characters in 9 languages
  • That Powerful ESCAPE Character -- Key and Sequences – ボブ・バーマー

 この記事にはパブリックドメインである、アメリカ合衆国連邦政府が作成した次の文書本文を含む。Federal Standard 1037C. 一般調達局.


エスケープ処理とは?

正規表現でエスケープが必要な記号一覧 文字クラス内の場合|僕らの適正技術

エスケープ・改行・スライス shinoblogmanabu

Android 開発文字 変換 forcesuppo

C++ エスケープ文字 Delft スタック