概述
在計算機科學與遠程通信中, 脫逸碼是這樣一個字元,標誌著在一個字元序列中出現在它之後的後續幾個字元採取一種替代解釋。脫逸碼是元字元(en:metacharacter)的一種特殊情況。通常,判定某字元是否為 脫逸碼由上下文確定。脫逸碼即標誌著轉義序列開始的那個字元。
脫逸碼的英文為Escape character。原本是指ASCII中的十進制27,十六進制1B,八進制033所定義的那個字元。對應於標準鍵盤左上角的ESC鍵。老式鍵盤如果沒有ESC鍵,替代輸入是“Ctrl+[”。在老式的計算機外設控制協定,ASCII碼的十進制27這個字元開始的一個字元序列,是外設的控制序列,不能按照這些字元的字面意義解釋。後來,就把最初的狹義的Escape character的含義引申開來,在各種計算機語言與協定中,標誌著一個轉義序列開始的那個字元,都叫做Escape character。最常見的一個例子是C程式設計語言中,用反斜線字元“\”作為脫逸碼,來表示那些不可列印的ASCII控制符。在URI協定中,脫逸碼是百分號“%”。
定義
脫逸碼是很多程式語言、數據格式和通信協定的形式文法的一部分。對於一個給定的字母表,一個脫逸碼的目的是開始一個字元序列,使得脫逸碼開頭的該字元序列具有不同於該字元序列單獨出現(沒有脫逸碼開頭)時的語義。因此脫逸碼開頭的字元序列被叫做 轉義序列。一個脫逸碼可能並沒有它自己的意思,因此所有轉義序列具有2個或更多字元。
轉義序列通常有兩種功能。第一個是編碼一個句法上的實體,如設備命令或者無法被字母表直接表示的特殊數據。第二種功能,也叫 字元引用,用於表示無法在當前上下文中被鍵盤錄入的字元(如字元串中的回車符),或者在當前上下文中會有不期望的含義的字元(如C語言字元串中的雙引號字元",不能直接出現,必須用轉義序列表示)。在後面那種情況,轉義序列是一種由脫逸碼自身和一個被引用的字元組成的一個二合字母(digraph)情形。
套用
ASCII脫逸碼[編輯]
參見:轉義序列及en:ANSI escape code
ASCII的"escape"字元(八進制:\033,或 ^[,或十進制27)被用於許多輸出設備,標誌著開始一個脫逸碼序列。例如^[,後跟可列印字元 [2;10H,將引起DEC的VT102終端把游標移動到螢幕的第2行第10個單元。在1970年代到1980年代的人機界面中,使用Esc鍵作為脫逸碼,開始一個轉義序列,是非常常見的。但現在一般放棄了這種用法。
程式設計與數據格式[編輯]
許多程式設計語言把雙引號字元( ")用作字元串的分界符。反斜線( \)脫逸碼提供了兩種方式來把雙引號字元置入字元串中,或者是使用轉義序列 \"表示單個的 "字元本身,而不是作為字元串分界符;或者是直接開始字元 "的16進制編碼值的轉義序列 \x22來表示 ".也可以使用8進制編碼值的轉義序列,如 \042.
在Perl或者Python程式設計語言中
print "Nancy said "Hello World!" to the crowd.";
將產生語法錯誤。而
print "Nancy said \"Hello World!\" to the crowd."; ### example of \"
將產生期望的輸出結果。 另一種可選擇的辦法是:
print "Nancy said \x22Hello World!\x22 to them."; ### example of \x22
使用雙引號字元編碼值的十六進制"x22"脫逸碼序列. 但是,如果運行在非ASCII計算機上,將不會產生預期的結果。
C語言,C++,Java語言都具有上述兩種反斜線脫逸碼的用法.PostScript語言與微軟的Rich Text Format也使用反斜線脫逸碼.quoted-printable編碼使用等號(=)作為脫逸碼。
URL與URI使用%-轉碼來表示特殊字元,例如非ASCII字元.SGML及其派生的HTML與XML使用&字元作為字元編碼引用的脫逸碼。
通信協定[編輯]
在點對點協定中,0x7D被用作脫逸碼。
Bourne shell[編輯]
Bourne shell(sh),*字元與?字元是通配符。如果沒有前導的脫逸碼, *將擴展為工作目錄下的所有不是點符號(.)開頭的檔案名稱。因此,如果想引用一個檔案名稱就叫做"*"的檔案,必須避免檔案名稱擴展開,就得在它的前面加上脫逸碼反斜線 ( \).比較下屬兩個例子:
rm * # 刪除當前目錄下所有檔案rm \* # 刪除名字叫做*的檔案 |
Windows命令行[編輯]
Windows命令行終端使用^字元轉義那些具有特殊含義的保留字元 (如: & | ( ) < > ^).DOS命令行終端並不支持這一實現。
例如,Windows命令行終端中輸入這一命令將會產生錯誤
echo <wiki>
但下述輸入將產生正確的期望結果: <wiki>
echo ^<wiki^>
差別
與控制字元的差別
脫逸碼不屬於控制字元;控制字元也不屬於脫逸碼。如果控制字元的定義是非圖形的字元,或者對輸出設備(印表機、文本終端)有特殊意義的字元,那么針對這些設備的脫逸碼也是控制字元。但是程式設計用的脫逸碼是圖形字元,因此它們不是控制字元。相反地,大多數ASCII控制字元單獨都具有控制功能,因此它們不是脫逸碼。