1、轉(zhuǎn)義字符
所有的ASCII碼都可以用“\”加數(shù)字(一般是8進(jìn)制數(shù)字)來(lái)表示。而C中定義了一些字母前加“\”來(lái)表示常見(jiàn)的那些不能顯示的ASCII字符,如\0,\t,\n等,就稱(chēng)為轉(zhuǎn)義字符,因?yàn)楹竺娴淖址?,都不是它本?lái)的ASCII字符意思了。
2、字符表
所有的轉(zhuǎn)義字符和所對(duì)應(yīng)的意義:
3、字符型常量
字符型常量所表示的值是字符型變量所能包含的值。我們可以用ASCII表達(dá)式來(lái)表示一個(gè)字符型常量,或者用單引號(hào)內(nèi)加反斜杠表示轉(zhuǎn)義字符。
‘A’, ‘\x2f’, ‘\013’;
其中:\x表示后面的字符是十六進(jìn)制數(shù),\表示后面的字符是八進(jìn)制數(shù)。例如十進(jìn)制的17用十六進(jìn)制表示就是
‘\x11’,用八進(jìn)制表示就是‘\21’;
注意:在Turbo C 2.0中,字符型常量表示數(shù)的范圍是-128到127,除非你把它聲明為unsigned,這樣就是0到255。
上面我們見(jiàn)到的\x,\n,\a等等都是叫轉(zhuǎn)義字符,它告訴編譯器需要用特殊的方式進(jìn)行處理。
4、組成
轉(zhuǎn)義字符串(Escape String),即字符實(shí)體(Character Entity)分成三部分:第一部分是一個(gè)&符號(hào),英文叫ampersand;第二部分是實(shí)體(Entity)名字或者是#加上實(shí)體(Entity)編號(hào);第三部分是一個(gè)分號(hào)。
比如,要顯示小于號(hào)(《),就可以寫(xiě) 《 或者 《 。
用實(shí)體(Entity)名字的好處是比較好理解,一看lt,大概就猜出是less than的意思,但是其劣勢(shì)在于并不是所有的瀏覽器都支持最新的Entity名字。而實(shí)體(Entity)編號(hào),各種瀏覽器都能處理。
提示:實(shí)體名稱(chēng)(Entity)是區(qū)分大小寫(xiě)的。
備注:同一個(gè)符號(hào),可以用“實(shí)體名稱(chēng)”和“實(shí)體編號(hào)”兩種方式引用,“實(shí)體名稱(chēng)”的優(yōu)勢(shì)在于便于記憶,但不能保證所有的瀏覽器都能順利識(shí)別它,而“實(shí)體編號(hào)”則沒(méi)有這種擔(dān)憂,但它實(shí)在不方便記憶。
5、編程語(yǔ)言
如HTML轉(zhuǎn)義符、java 轉(zhuǎn)義符、xml 轉(zhuǎn)義符、 oracle 轉(zhuǎn)義符、sql 轉(zhuǎn)義符 、sqlserver 轉(zhuǎn)義符、php 轉(zhuǎn)義符、asp 轉(zhuǎn)義符、vb轉(zhuǎn)義符、 javascript 轉(zhuǎn)義符等等,還有網(wǎng)址中的百分號(hào)。
例如,HTML的《 》&“?分別是《,》,&,”,?;的轉(zhuǎn)義字符
XML只有5個(gè)轉(zhuǎn)義符: 《 》& “ ‘
6、作用
轉(zhuǎn)義字符串(Escape Sequence)也稱(chēng)字符實(shí)體(Character Entity)。在HTML中,定義轉(zhuǎn)義字符串的原因有兩個(gè):第一個(gè)原因是像“《”和“》”這類(lèi)符號(hào)已經(jīng)用來(lái)表示HTML標(biāo)簽,因此就不能直接當(dāng)做文本中的符號(hào)來(lái)使用。為了在HTML文檔中使用這些符號(hào),就需要定義它的轉(zhuǎn)義字符串。當(dāng)解釋程序遇到這類(lèi)字符串時(shí)就把它解釋為真實(shí)的字符。在輸入轉(zhuǎn)義字符串時(shí),要嚴(yán)格遵守字母大小寫(xiě)的規(guī)則。第二個(gè)原因是,有些字符在ASCII字符集中沒(méi)有定義,因此需要使用轉(zhuǎn)義字符串來(lái)表示。
其實(shí)所有編程語(yǔ)言,擁有轉(zhuǎn)義字符的原因基本上是兩點(diǎn):一、使用轉(zhuǎn)義字符來(lái)表示字符集中定義的字符,比如ASCll里面的控制字符及回車(chē)換行等字符,這些字符都沒(méi)有現(xiàn)成的文字代號(hào)。所以只能用轉(zhuǎn)義字符來(lái)表示 。二、某一些特定的字符在編輯語(yǔ)言中被定義為特殊用途的字符。這些字符由于被定義為特殊用途,它們失去了原有的意義。比如說(shuō)Html中,《被HTML定義為標(biāo)簽的開(kāi)始,所以當(dāng)我們轉(zhuǎn)入《時(shí),HTML就會(huì)把它當(dāng)作為開(kāi)始,而不是當(dāng)作一個(gè)《來(lái)看待。再如PHP 的雙引號(hào)(“),被PHP定義為字符串的外圍標(biāo)簽,所以如果你在一對(duì)雙引號(hào)里面,還想要使用雙引號(hào),只能使用轉(zhuǎn)義字符了。不然PHP就會(huì)報(bào)錯(cuò)了。
從上面也可以看出轉(zhuǎn)義無(wú)非是兩種情況:1:將普通字符轉(zhuǎn)為特殊用途,一般是編程語(yǔ)言中,用于表示不能直接顯示的字符,比如后退鍵,回車(chē)鍵,等。2:用來(lái)將特殊意義的字符轉(zhuǎn)換回它原來(lái)的意義。一般用在正則表達(dá)式中。還有有些腳本語(yǔ)言是弱類(lèi)型,有些語(yǔ)言比如html 并不是編程語(yǔ)言,而是標(biāo)記語(yǔ)言,有些語(yǔ)言只有一種類(lèi)型 比如shell 腳本語(yǔ)言,這些語(yǔ)言中字符串都不加引號(hào)” ” ,或者可以不加引號(hào)“ ”,所以有時(shí)候需要轉(zhuǎn)義字符說(shuō)明某字符此時(shí)的身份是普通字符,而不是有特殊意義的元字符。
另外出于網(wǎng)站的安全。在數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)前,都會(huì)使用轉(zhuǎn)義字符(函數(shù))對(duì)一些敏感字符進(jìn)行轉(zhuǎn)義。這樣做可以避免一些別有用心的人利用特殊符號(hào)的注入攻擊。
7、顯示空格
通常情況下,HTML會(huì)自動(dòng)截去多余的空格。不管你加多少空格,都被看做一個(gè)空格。比如你在兩個(gè)字之間加了10個(gè)空格,HTML會(huì)截去9個(gè)空格,只保留一個(gè)。為了在網(wǎng)頁(yè)中增加空格,你可以使用 表示空格。
8、url
web 開(kāi)發(fā)中通過(guò)問(wèn)號(hào)(?)方式在瀏覽器地址欄中傳值時(shí)。瀏覽器是通過(guò)“&”來(lái)區(qū)分問(wèn)號(hào)后的參數(shù)個(gè)數(shù)的。 如果出現(xiàn)傳值參數(shù)中帶有“&”時(shí),在接受頁(yè)面就會(huì)出現(xiàn)錯(cuò)誤,類(lèi)似如下請(qǐng)求路徑:/next.jsp?param1=hendhs89&furej & param2=sss
參數(shù)param1中含有轉(zhuǎn)義字符“&” ,這樣會(huì)導(dǎo)致被請(qǐng)求頁(yè)的參數(shù)接收錯(cuò)誤。
在傳值前 通過(guò) java.net.URLEncoder.encode(param1) 編碼處理后,可將轉(zhuǎn)義字符轉(zhuǎn)為16進(jìn)制;
1) + URL 中+號(hào)表示空格 %2B
2) 空格 URL中的空格可以用+號(hào)或者編碼 %20
3) / 分隔目錄和子目錄 %2F
4)? 分隔實(shí)際的 URL 和參數(shù) %3F
5) % 指定特殊字符 %25
6) # 表示書(shū)簽 %23
7) & URL中指定的參數(shù)間的分隔符%26
8) = URL中指定參數(shù)的值 %3D
9)! URL中指定參數(shù)的值 %21
9、如何避免
在編寫(xiě)網(wǎng)頁(yè)時(shí),如果直接在雙引號(hào)之間輸入路徑,其中的“\”及其之后的文本易被誤認(rèn)為轉(zhuǎn)義字符。為避免這一點(diǎn),C#等語(yǔ)言只需在字符串的引號(hào)前加“@”符號(hào)(不包括外側(cè)引號(hào))。如:@ ”c:\ab\cd\ef.jpg“ 。
評(píng)論