定義
轉義字元是很多程式語言、數據格式和通信協定的形式文法的一部分。對於一個給定的字母表,一個轉義字元的目的是開始一個字元序列,使得轉義字元開頭的該字元序列具有不同於該字元序列單獨出現時的語義。因此轉義字元開頭的字元序列被叫做轉義序列。
轉義序列通常有兩種功能。第一個是編碼一個句法上的實體,如設備命令或者無法被字母表直接表示的特殊數據。第二種功能,也叫字元引用,用於表示無法在當前上下文中被鍵盤錄入的字元(如字元串中的回車符),或者在當前上下文中會有不期望的含義的字元(如C語言字元串中的雙引號字元",不能直接出現,必須用轉義序列表示)。在後面那種情況,轉義序列是一種由轉義字元自身和一個被引用的字元組成的一個二合字母(digraph)情形。
控制字元
轉義字元不屬於控制字元;控制字元也不屬於轉義字元。如果控制字元的定義是非圖形的字元,或者對輸出設備(印表機、文本終端)有特殊意義的字元,那么針對這些設備的轉義字元也是控制字元。但是程式設計用的轉義字元是圖形字元,因此它們不是控制字元。相反地,大多數ASCII控制字元單獨都具有控制功能,因此它們不是轉義字元。
字元表
所有的轉義字元和所對應的意義:
轉義字元
| 意義
| ASCII碼值(十進制)
|
\a
| 響鈴(BEL)
| 007
|
\b
| 退格(BS) ,將當前位置移到前一列
| 008
|
\f
| 換頁(FF),將當前位置移到下頁開頭
| 012
|
\n
| 換行(LF) ,將當前位置移到下一行開頭
| 010
|
\r
| 回車(CR) ,將當前位置移到本行開頭
| 013
|
\t
| 水平制表(HT) (跳到下一個TAB位置)
| 009
|
\v
| 垂直制表(VT)
| 011
|
\\
| 代表一個反斜線字元''\'
| 092
|
\'
| 代表一個單引號(撇號)字元
| 039
|
\"
| 代表一個雙引號字元
| 034
|
\? | 代表一個問號 | 063 |
\0
| 空字元(NUL)
| 000
|
\ddd
| 1到3位八進制數所代表的任意字元
| 三位八進制
|
\xhh
| 十六進制所代表的任意字元
| 十六進制
|
注意:
1. 區分,斜槓:"/" 與 反斜槓:"\" ,此處不可互換
2. \xhh 十六進制轉義不限制字元個數 '\x000000000000F' == '\xF'
字元型常量
字元型常量所表示的值是字元型變數所能包含的值。我們可以用ASCII
表達式來表示一個字元型常量,或者用單引號內加
反斜槓表示轉義字元。
'A', '\x2f', '\013';
其中:\x表示後面的字元是
十六進制數,\o表示後面的字元是八進制數。例如十進制的17用十六進制表示就是
‘\x11’,用八進制表示就是‘\021’;
注意:在Turbo C 2.0中,字元型
常量表示數的範圍是-128到127,除非你把它聲明為unsigned,這樣就是0到255。
上面我們見到的\x,\n,\a等等都是叫轉義字元,它告訴
編譯器需要用特殊的方式進行處理。
組成
轉義字元串(Escape String),即字元實體(Character Entity)分成三部分:第一部分是一個&符號,英文叫ampersand;第二部分是實體(Entity)名字或者是#加上實體(Entity)編號;第三部分是一個分號。
比如,要顯示小於號(<),就可以寫 < 或者 < 。
用實體(Entity)名字的好處是比較好理解,一看lt,大概就猜出是less than的意思,但是其劣勢在於並不是所有的瀏覽器都支持最新的Entity名字。而實體(Entity)編號,各種瀏覽器都能處理。
提示:實體名稱(Entity)是區分大小寫的。
備註:同一個符號,可以用“實體名稱”和“實體編號”兩種方式引用,“實體名稱”的優勢在於便於記憶,但不能保證所有的瀏覽器都能順利識別它,而“實體編號”則沒有這種擔憂,但它實在不方便記憶。
程式語言
如HTML轉義符、java 轉義符、xml 轉義符、 oracle 轉義符、sql 轉義符 、sqlserver 轉義符、php 轉義符、asp 轉義符、vb轉義符、 javascript 轉義符等等,還有網址中的
百分號。
例如,HTML的< >&"©分別是<,>,&,",©;的轉義字元
XML只有5個轉義符: < >& " '
作用
轉義字元串(Escape Sequence)也稱字元實體(Character Entity)。在HTML中,定義轉義字元串的原因有兩個:第一個原因是像“<”和“>”這類符號已經用來表示HTML標籤,因此就不能直接當做文本中的符號來使用。為了在HTML文檔中使用這些符號,就需要定義它的轉義字元串。當
解釋程式遇到這類字元串時就把它解釋為真實的字元。在輸入轉義字元串時,要嚴格遵守字母大小寫的規則。第二個原因是,有些字元在ASCII字元集中沒有定義,因此需要使用轉義字元串來表示。
其實所有程式語言,擁有轉義字元的原因基本上是兩點:一、使用轉義字元來表示字元集中定義的字元,比如ASCll裡面的
控制字元及回車換行等字元,這些字元都沒有現成的文字代號。所以只能用轉義字元來表示 。二、某一些特定的字元在編輯語言中被定義為特殊用途的字元。這些字元由於被定義為特殊用途,它們失去了原有的意義。比如說Html中,<被HTML定義為標籤的開始,所以當我們轉入<時,HTML就會把它當作為開始,而不是當作一個<來看待。再如PHP 的雙引號("),被PHP定義為字元串的外圍標籤,所以如果你在一對雙引號裡面,還想要使用雙引號,只能使用轉義字元了。不然PHP就會報錯了。
從上面也可以看出轉義無非是兩種情況:1:將普通字元轉為特殊用途,一般是程式語言中,用於表示不能直接顯示的字元,比如後退鍵,回車鍵,等。2:用來將特殊意義的字元轉換回它原來的意義。一般用在正則表達式中。還有有些腳本語言是弱類型,有些語言比如html 並不是程式語言,而是標記語言,有些語言只有一種類型 比如shell 腳本語言,這些語言中字元串都不加引號” ” ,或者可以不加引號“ ”,所以有時候需要轉義字元說明某字元此時的身份是普通字元,而不是有特殊意義的元字元。
另外出於網站的安全。在數據寫入資料庫前,都會使用轉義字元(函式)對一些敏感字元進行轉義。這樣做可以避免一些別有用心的人利用特殊符號的注入攻擊。
顯示空格
通常情況下,HTML會自動截去多餘的空格。不管你加多少空格,都被看做一個空格。比如你在兩個字之間加了10個空格,HTML會截去9個空格,只保留一個。為了在網頁中增加空格,你可以使用 表示空格。
url
web 開發中通過問號(?)方式在瀏覽器地址欄中傳值時。瀏覽器是通過“&”來區分問號後的參數個數的。 如果出現傳值參數中帶有“&”時,在接受頁面就會出現錯誤,類似如下請求路徑:/next.jsp?param1=hendhs89&furej & param2=sss
參數param1中含有轉義字元“&” ,這樣會導致被請求頁的參數接收錯誤。
在傳值前 通過 java.net.URLEncoder.encode(param1) 編碼處理後,可將轉義字元轉為16進制;
1. + URL 中+號表示空格 %2B
2. 空格 URL中的空格可以用+號或者編碼 %20
3. / 分隔目錄和子目錄 %2F
4. ? 分隔實際的 URL 和參數 %3F
5. % 指定特殊字元 %25
6. # 表示書籤 %23
8. = URL中指定參數的值 %3D
9. ! URL中指定參數的值 %21