跳脫字元

電腦科學遠端通訊中,當跳脫字元Escape Character)放在字元序列時,它將對它後續的幾個字元進行替代並解釋。跳脫字元是元字元的一種特殊情況。通常,判定某字元是否為跳脫字元由上下文確定。跳脫字元即標誌着跳脫序列開始的那個字元。

「跳脫字元」的各地常用名稱
中國大陸轉義字符
臺灣跳脫字元,逸出字元

跳脫字元原本是指ASCII中的十進制27,十六進制1B,八進制033所定義的那個字元。對應於標準鍵盤左上角的ESC鍵。老式鍵盤如果沒有ESC鍵,替代輸入是「Ctrl+[」。在老式的電腦外設控制協定,ASCII碼的十進制27這個字元開始的一個字元序列,是外設的控制序列,不能按照這些字元的字面意義解釋。後來,就把最初的狹義的Escape character的含義引申開來,在各種電腦語言與協定中,標誌着一個跳脫序列開始的那個字元,都叫做Escape character。最常見的一個例子是C程式語言中,用反斜線字元「\」作為跳脫字元,來表示那些不可列印的ASCII控制符。在URI協定中,跳脫字元是百分號「%」。

定義

跳脫字元是很多程式語言、數據格式和通訊協定的形式文法的一部分。對於一個給定的字母表,一個跳脫字元的目的是開始一個字元序列,使得跳脫字元開頭的該字元序列具有不同於該字元序列單獨出現(沒有跳脫字元開頭)時的語意。因此跳脫字元開頭的字元序列被叫做跳脫序列。一個跳脫字元可能並沒有它自己的意思,因此所有跳脫序列具有2個或更多字元。

跳脫序列通常有兩種功能。第一個是編碼一個句法上的實體,如裝置命令或者無法被字母表直接表示的特殊數據。第二種功能,也叫字元參照,用於表示無法在當前上下文中被鍵盤錄入的字元(如字串中的回車字元),或者在當前上下文中會有不期望的含義的字元(如C語言字串中的雙引號字元",不能直接出現,必須用跳脫序列表示)。在後面那種情況,跳脫序列是一種由跳脫字元自身和一個被參照的字元組成的一個二合字母(digraph)情形。

控制字元

跳脫字元不屬於控制字元;控制字元也不屬於跳脫字元。如果控制字元的定義是非圖形的字元,或者對輸出裝置(印表機、文字終端)有特殊意義的字元,那麼針對這些裝置的跳脫字元也是控制字元。但是程式設計用的跳脫字元是圖形字元,因此它們不是控制字元。相反地,大多數ASCII控制字元單獨都具有控制功能,因此它們不是跳脫字元。

跳脫字元在各個程式語言中的使用方法

在不同的程式語言中,跳脫字元的使用方法均不同。

在java中

樣式 含義
\123 1~3位八進制數據所表示的字元,如\256
\uF890 4位元十六進制數據所表示的字元,如\u0014
\' 單引號字元
\\ 反斜槓字元
\t 水平制表符
\r Enter
\n 換行符
\b 退格
\f 換頁

例子

ASCII跳脫字元

ASCII的「Escape」字元被用於許多輸出裝置,標誌着開始一個跳脫字元序列。例如^[,後跟可列印字元[2;10H,將引起DECVT102終端把游標移動到螢幕的第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編碼使用等號(=)作為跳脫字元。

URLURI使用%-轉碼來表示特殊字元,例如非ASCII字元。SGML及其衍生的HTMLXML使用&字元作為字元編碼參照的跳脫字元。

通訊協定

對等協定中,0x7D被用作跳脫字元。

Bourne shell

Bourne shell(sh)中,*字元與?字元是萬用字元。如果沒有前導的跳脫字元,*將擴充為工作目錄下的所有不是點符號(.)開頭的檔名。因此,如果想參照一個檔名就叫做"*"的檔案,必須避免檔名擴充開,就得在它的前面加上跳脫字元反斜線(\)。比較下列兩個例子:

 
rm *    # 删除当前目录下所有文件

rm \*   # 删除名字叫做*的文件

Windows命令列

Windows命令列終端使用^字元跳脫那些具有特殊含義的保留字元(如:& | ( ) < > ^)。[1] DOS命令列終端並不支援這一轉錄。

例如,Windows命令列終端中輸入這一命令將會產生錯誤

echo <wiki>

但下述輸入將產生正確的期望結果:<wiki>

echo ^<wiki^>

其它

  • Quoted-printable,把8位元數據編碼為7位元有限行長的數據,使用=作為跳脫字元。

參見

參考文獻

  1. ^ Tim Hill. The Windows NT Command Shell. MacMillan Technical Publishing. 1998 [2010-01-13]. (原始內容存檔於2017-09-03). 

外部連結