轉義字符

計算機科學遠程通信中,當轉義字符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 回車
\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). 

外部連結