RFC 3986 規(guī)定,Percent encoding的非保留字如下:
Unreserved characters, per RFC 3986 (January 2005) A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 - _ . ~
也就是說,這些字出現(xiàn)在 URI 中的時候,不進行編碼,因為他們和URI的格式?jīng)]有關(guān)系,只是表示原義的字符
另外,保留字如下:
Reserved characters, per RFC 3986 (January 2005) ! * ‘ ( ) ; : @ & = + $ , / ? % # [ ]
這些字符,是有特殊意義的,如果在不代表那些特殊意義而代表原意的時候出現(xiàn),必須經(jīng)過編碼,如下:
Reserved characters after percent-encoding ! * ‘ ( ) ; : @ & = + $ , / ? % # [ ] %21 %2A %27 %28 %29 %3B %3A %40 %26 %3D %2B %24 %2C %2F %3F %25 %23 %5B %5D
而 % 號后面就是一個2位的十六進制數(shù),這個數(shù),就是 Unicode 的 UTF-8 編碼的另一種表現(xiàn)形式。
讓我們詳細還原一下’口’ 字為什么是 ‘%E5%8F%A3′ 吧。
剛才我們談到 ‘口’ 的 Unicode 編碼 21475 的二進制形式是: 101001111100011
剛才我們又聊到,對于一個的漢字,它的UTF-8編碼的形式是: U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
現(xiàn)在我們做個填空題,把 ‘口’ 二進制碼切開填進去替換掉 x: 101001111100011 = ----0101 --001111 --100011 101001111100011 = 1110xxxx 10xxxxxx 10xxxxxx 第一個字節(jié)少一位,左邊加個0補齊,得到: 11100101 10001111 10100011
讓我們把這三個二進制數(shù)轉(zhuǎn)換成16進制,并且加上百分號,運行如下javascript代碼:
alert( ‘%’ + parseInt(’11100101′, 2).toString(16) + ‘%’ + parseInt(’10001111′, 2).toString(16) + ‘%’ + parseInt(’10100011′, 2).toString(16) ) // get ‘%e5%8f%a3′
怎么樣,得到 %e5%8f%a3 了吧。
另外javascript的內(nèi)置函數(shù) encodeURI、decodeURI、encodeURIComponent、decodeURIComponent 就是進行的 Percent Encode,只是在對待 : / ; ?等特殊字符的時候有區(qū)別。
另外,再介紹一下 HTML 中的 Numeric character reference, NCR編碼 相信大家都知道,HTML中的特殊字符是需要編碼的,比如 & 需要被編碼為: & 還有 ® 這樣的特殊字符。其實HTML也是可以利用 Unicode 編碼來顯示任何一個字符的,編輯一個如下的html文件:
<html> <body> 口 口 口 </body> </html>
結(jié)果就是三個“口”字。
還有一種常用的編碼是 base64 編碼,base64編碼本來是為了在 email 這樣的非純 8-bit 的傳輸層傳輸二進制數(shù)據(jù)而設計出來的,這樣就可以在 email 中傳遞二進制的附件。它用 a-z A-Z 0-9 +/= 這64個字符來表示原有的數(shù)據(jù),并且將連續(xù)的三個字符編碼為四個,長度增加33%。 這個編碼方式在一些比較超前的 javascript 應用中比較常用,例如 這個超級瑪麗游戲 ,它里面的音樂就是寫 javascript 文件中的。例如 這個 利用 canvas 作圖的例子,里面的頭像也是寫在 javascript 源代碼中的。這就是 RFC 2397 規(guī)定的 data URIs 協(xié)議,F(xiàn)irefox 瀏覽器支持,IE8也開始部分支持了,利用 data URIs 和 base64 編碼,我們可以不借助任何外來的音樂、圖像等多媒體文件而創(chuàng)造出豐富的效果。
以上就是我想介紹的 javascript 和 html 中常用到的編碼和原理,最后還想提到一句,很多的黑客行為都和編碼有關(guān),用編碼后的代碼來通過一些簡單的過濾,如下js代碼:
var a = ‘口碑’; \u0061 = ‘koubei.com’; alert(a); //get ‘koubei.com’
當然,黑客們會有更專業(yè)的方式來逃避過濾、注入代碼(如 sql injection, XSS 攻擊等)。
謝謝大家的閱讀,我是 stauren, 雅虎口碑UED團隊的前端開發(fā)工程師粽子,這是我第一次在Koubei的UED blog上發(fā)表文章,如果有錯誤的地方請大家指出。同時歡迎訪問我的個人blog : http://stauren.net, 并且提供在線 Hex、NCR、Percent encode、Base64編碼解碼工具:http://stauren.net/lab
本文鏈接:http://m.95time.cn/tech/web/2008/6343.asp
出處:口碑網(wǎng)UED Team
責任編輯:bluehearts
上一頁 HTML與javascript中常用編碼淺析 [2] 下一頁
◎進入論壇網(wǎng)頁制作、WEB標準化版塊參加討論,我還想發(fā)表評論。
|