エスケープシーケンス

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータサイエンスではエスケープシーケンスは、そこに含まれるリテラル文字以外の意味を持つ文字の組み合わせです。[1] 1つ以上の先行する(場合によっては終了する)文字でマークされます。[2]

  • Cおよび多くの派生プログラミング言語では、文字列エスケープシーケンスは、バックスラッシュで始まる\一連の2つ以上の文字です。[3]
    • Cでは、バックスラッシュの直後に改行が続くことはエスケープシーケンスを構成しませが、2番目の変換フェーズで物理ソースラインを論理ソースラインにスプライスしますが、文字列エスケープシーケンスは5番目の変換フェーズで変換されることに注意してください。[4]
    • バックスラッシュ文字自体を表すために、\\を使用できます。これにより、最初のバックスラッシュはエスケープを示し、2番目のバックスラッシュはバックスラッシュがエスケープされていることを示します。[5]
    • キャラクターは複数の異なる方法でエスケープできます。ASCIIエンコードを想定すると、エスケープシーケンス\x5c16進数\\、、\1348進数)および\x5Cすべてが同じ文字(バックスラッシュ)をエンコードします\
  • ANSIエスケープシーケンスに応答するデバイスの場合、ASCII「エスケープ」文字(10進文字コード27)で始まり、左括弧文字[(10進文字コード91)が続く3文字以上の組み合わせがエスケープシーケンスを定義します。

制御シーケンス

この一連の文字は、通常のデータバイトのように表示または印刷されるのではなく、コンピューターとそれに接続されている周辺デバイスの状態変更するために使用されます。これらは、デバイス制御の使用を反映して、制御シーケンスとも呼ばれます。制御シーケンスイニシエーターを使用-元々は「エスケープ文字」ASCIIコード-文字27(10進数)-キーキャップに「Esc」と書かれることがよくあります

ANSI端末の導入により、ほとんどのエスケープシーケンスは、2文字の「ESC」、次に「[」、またはコード155(10進数) の特別に割り当てられたCSI文字で始まりました。

すべての制御シーケンスがエスケープ文字を使用しているわけではありません。例えば:

  • データゼネラルの端末制御シーケンス[8] [9] [10]ですが、それでもエスケープシーケンスと呼ばれることが多く、プログラミング言語やコマンドラインパラメータでの特殊文字の「エスケープ」の非常に一般的な使用法では、「バックスラッシュ」がよく使用されます。シーケンスを開始する文字。

通信におけるエスケープシーケンスは、コンピュータと周辺機器が情報をやり取りするためのチャネルが1つしかない場合に一般的に使用されます(したがって、エスケープシーケンスは帯域内信号方式の例です)。[11] [12]ほとんどのダム端末がASCIIを使用する場合に一般的でした通信用に7データビットを使用し、7データビットで使用可能な128コードによって制限される「外部」またはグラフィック文字用の別の文字セットに切り替えるために使用される場合があります。比較的「ダム」端末でさえ、文字27と31に応答して文字モードと数字モードを切り替える、元の機械式テレタイププリンター(「ガラステレタイプ」またはVDUのベース)を含むいくつかのエスケープシーケンスに応答しました。

キーボード

エスケープ文字は通常、コンピューターのキーボードのEscキーに割り当てられ、エスケープシーケンスの一部として以外の方法で送信できます。たとえば、Escキーは、vi[13]などのエディタで入力文字として使用したり、一部のアプリケーションでメニューの1つのレベルをバックアップしたりするために使用できます。[14] Hewlett Packard HP 2640端末には、アプリケーション のデバッグを支援するために、Escを含むすべての制御文字のグラフィックを表示する「表示機能」モードのキーがありました。

エスケープシーケンスを送信するEscキーとその他のキーの両方がアプリケーションにとって意味があると想定される場合、文字端末が使用されているとあいまいさが生じます。アプリケーションがASCIIエスケープ文字を受信した場合、その文字がユーザーがEscキーを押した結果であるのか、それともエスケープシーケンスの最初の文字であるのか(たとえば、矢印キーを押した結果)は明確ではありません。あいまいさを解決する従来の方法は、別の文字がエスケープ文字の直後に続くかどうかを観察することです。そうでない場合は、エスケープシーケンスの一部ではないと見なされます。このヒューリスティックは、状況によっては失敗する可能性があります。特に、最新の通信速度が速い場合はそうです。

エスケープシーケンスは、少なくとも1874年のBaudotコードにまでさかのぼります。[15] [16] [17]

モデム制御

たとえば、Hayesコマンドセットは、単一のエスケープシーケンス+++定義します。(データの一部である可能性のある+++をエスケープシーケンスとして解釈するために、送信者は+++の前後1秒間通信を停止します)。モデムがデータのストリームでこれに遭遇すると、スイッチが切り替わります。任意の文字を電話に送信するだけの通常の動作モードから、次のデータがコマンド言語の一部であると想定されるコマンドモードまで。Oコマンドを送信する と、オンラインモードに戻ることができます。

Hayesコマンドセットはモーダルで、コマンドモードからオンラインモードに切り替わります。[18] [19]これは、コマンドとデータが急速に前後に切り替わる場合には適切ではありません。非モーダルエスケープシーケンス制御言語の例はVT100で、これは制御シーケンスイントロデューサーのプレフィックスが付いた一連のコマンドを使用していました

制御文字との比較

制御文字は、単独で、キャリッジリターン(CR)などの制御機能を持つ文字です。対照的に、エスケープシーケンスは、後続の文字の解釈を変更する 1つ以上のエスケープ文字で構成されます。

ASCIIビデオデータ端末

VT52端末はescape-Aのような単純な有向グラフコマンドを使用ました。単独では、「A」は単に文字「A」を意味しましたが、エスケープシーケンス「escape-A」の一部として、それは異なる意味を持っていました。VT52はパラメーターもサポートしていました。これは、置換としてエンコードされた単純な制御言語ではありませんでした。

後のVT100端末は、カーソルの動きの制御、文字セット、表示の強化などの機能のために、より洗練されたANSIエスケープシーケンス標準(現在はECMA-48)を実装しました。Hewlett Packard HP 2640シリーズには、ブロックモードと文字モード、プログラミングキーとそのソフトラベル、グラフィックスベクトル、さらにはデータをテープやディスクファイルに保存するための最も複雑なエスケープシーケンスがありました。

DOSおよびWindowsでの使用

ユーティリティANSI.SYS [20]を使用して、 DOSPROMPTコマンドで使用)または16ビットWindowsのコマンドウィンドウでANSI(ECMA-48)端末エスケープシーケンスの解釈を有効にすることができますディスプレイカードに直接書き込むGUIアプリケーションの台頭により、Microsoftプラットフォームでのエスケープシーケンスの使用が大幅に削減されましたが、それらを使用して、次のような文字ベースのライブラリルーチンを使用したインタラクティブなランダムアクセス文字ベースの画面インターフェイスを作成できます。GUIプログラムに頼らずに printfとして。$e

LinuxおよびUnixディスプレイでの使用

デフォルトのテキスト端末とテキストウィンドウ(xtermの使用など)は、ANSIエスケープシーケンスに応答します。

エスケープの引用

概要

引用符で囲まれた/エスケープされた文字列内に エスケープ文字が必要な場合、プログラミング言語とスクリプト言語で使用される2つの戦略があります。

  • 2倍の区切り文字(例'He didn''t do it.'[21]
  • 二次エスケープシーケンス

後者の例は、キャレット(^)の使用です。たとえば、これはCMDに「カットアンドペーストで実行できます」と出力します(それ以外の場合、アンパサンドの使用は制限されています)[22]

echo Cut ^&Pasteを介してこれを行うことができます

詳細

エスケープシーケンスの一般的な使用法は、実際には、バイナリデータストリームで見つかった制御文字を削除して、誤って制御機能を引き起こさないようにすることです。この場合、制御文字は、定義された「エスケープ文字」(US-ASCIIエスケープ文字である必要はありません)および1つ以上の他の文字に置き換えられます。制御文字がアクションを引き起こしたコンテキストを終了した後、シーケンスが認識され、削除された文字に置き換えられます。[22]「エスケープ文字」自体を送信するために、2つのコピーが送信されます。[21]

多くのプログラミング言語およびコマンドラインインターフェイスでは、エスケープシーケンスは、文字リテラルおよび文字列リテラルで使用され、印刷できない文字や文字または文字列の構文と衝突する文字を表現します。たとえば、制御文字自体をエディタプログラムでコーディングされたプログラムに配置できない場合や、コマンドに入力した場合に望ましくない副作用が発生する場合があります。引用符の終わりの文字は、それをエスケープすることで解決できるプログラマーにとっての問題でもあります。ほとんどの場合、エスケープ文字は円記号( " \ ")です。

サンプル

たとえば、一重引用符は'\''、書き込み'''が許可されていないため、と表現される場合があります。

最近のプログラミング言語の多くは、文字列リテラルの区切り文字として二重引用符(")を指定しています。バックスラッシュエスケープ文字は通常、文字列()に埋め込まれた二重引用符文字の意味を変更したり、二重引用符文字の16進値を含む文字シーケンスの意味を変更したりするなどして、文字列リテラル内に二重引用符を含める方法を提供します。 )。どちらのシーケンスも、リテラルの二重引用符()をエンコードします。 \"\x22"

PerlまたはPython2場合

印刷 "ナンシーは" HelloWorld  「群衆に。」;

構文エラーが発生しますが、次のようになります。

印刷 「ナンシーは群衆に「HelloWorld!」と言った。」;   ### の例 \"

目的の出力を生成します。別の選択肢:

印刷 「ナンシーは群衆に\x22ハローワールド!\x22と言った。」;   ###\x22の例

「\x」を使用して、次の2文字が16進数であることを示します。「22」は、16進数の二重引用符のASCII値です。

CC ++Java、およびRubyはすべて、まったく同じ2つの円記号エスケープスタイルを許可します。PostScript言語とMicrosoftリッチテキスト形式もバックスラッシュエスケープを使用しますquoted-printableエンコーディングでは、等号をエスケープ文字として 使用します。

URLURIは、非ASCII文字の場合と同様に、 パーセントエンコードを使用して特別な意味を持つ文字を引用します。

もう1つの類似した(そして部分的に重複する)構文上のトリックは、革砥です。

一部のプログラミング言語では、エスケープ文字を必要とせずに、リテラルで特殊文字を表す他の方法も提供されています(区切り文字の衝突などを参照)。

も参照してください

参照

  1. ^ 「エスケープシーケンス」
  2. ^ 「キャラクター」Javaチュートリアル
  3. ^ 「エスケープシーケンス」バックスラッシュとそれに続く文字または数字の組み合わせで構成される文字の組み合わせは、エスケープシーケンスと呼ばれます。\
  4. ^ 「ISO/IEC9899:201x委員会ドラフトN1570」(PDF)5.1.1.2変換フェーズ、2 .:バックスラッシュ文字()の直後に改行文字が続く各インスタンスが削除され、物理ソース行を接続して論理ソース行を形成します。[...] \
  5. ^ 「エスケープシーケンス」
  6. ^ 「第5章– ATコマンド」(PDF)
  7. ^ 「アナログモデムモジュールのATコマンドセットとレジスタの概要」
  8. ^ 「データゼネラル端末:の議論」
  9. ^ 「ターミナルとは何ですか?」
  10. ^ 「データゼネラルDG210DG211ターミナルエミュレーションソフトウェア」
  11. ^ 「エスケープシーケンス」
  12. ^ 「ターミナルおよびプリンターのハンドブックの用語集」
  13. ^ 「12の便利な「vi」コマンド」viコマンド[…]Esc(エスケープ)キーを押すと、[…]
  14. ^ 「Escキーの5つの予期しない使用」PCworld2009-10-29。
  15. ^ 「ASCIIとは何ですか?エコノミストは説明します」エコノミスト2013-06-09。
  16. ^ 「BaudotおよびCCITTコード」1870年に発明され、1874年にJ.Baudotが特許を取得したBaudotコードは[…]
  17. ^ 「ヨーロッパでの文字セットの使用に関するガイド」制御文字の要素C0およびC1[…]1874年にJean-Maurice-EmileBaudot(1845-1903)が特許を取得した5ビットコード
  18. ^ 「基本的なヘイズATコマンドセット」2011-02-05。+++-「エスケープシーケンス」-このコマンドは、モデムをオンラインコマンドモードに戻すためのエスケープシーケンスを開始します
  19. ^ 「モデムプログラミングの基本」モデムがコマンドモードの場合、モデムはユーザーからのコマンドを受け入れることができます
  20. ^ 17.ANSI.SYSを理解する-MS-DOS6.22を使用した特別版
  21. ^ a b "アポストロフィ編集('aaa')(FORTRAN 77言語リファレンス)"フィールド内で、2つの連続したアポストロフィ[…]
  22. ^ ab "CMD-バッチ-キャレットによるエスケープ"