RFC 3986 规定,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 - _ . ~
也就是说,这些字出现在 URI 中的时候,不进行编码,因为他们和URI的格式没有关系,只是表示原义的字符
另外,保留字如下:
Reserved characters, per RFC 3986 (January 2005) ! * ‘ ( ) ; : @ & = + $ , / ? % # [ ]
这些字符,是有特殊意义的,如果在不代表那些特殊意义而代表原意的时候出现,必须经过编码,如下:
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位的十六进制数,这个数,就是 Unicode 的 UTF-8 编码的另一种表现形式。
让我们详细还原一下’口’ 字为什么是 ‘%E5%8F%A3′ 吧。
刚才我们谈到 ‘口’ 的 Unicode 编码 21475 的二进制形式是: 101001111100011
刚才我们又聊到,对于一个的汉字,它的UTF-8编码的形式是: U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
现在我们做个填空题,把 ‘口’ 二进制码切开填进去替换掉 x: 101001111100011 = ----0101 --001111 --100011 101001111100011 = 1110xxxx 10xxxxxx 10xxxxxx 第一个字节少一位,左边加个0补齐,得到: 11100101 10001111 10100011
让我们把这三个二进制数转换成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的内置函数 encodeURI、decodeURI、encodeURIComponent、decodeURIComponent 就是进行的 Percent Encode,只是在对待 : / ; ?等特殊字符的时候有区别。
另外,再介绍一下 HTML 中的 Numeric character reference, NCR编码 相信大家都知道,HTML中的特殊字符是需要编码的,比如 & 需要被编码为: & 还有 ® 这样的特殊字符。其实HTML也是可以利用 Unicode 编码来显示任何一个字符的,编辑一个如下的html文件:
<html> <body> 口 口 口 </body> </html>
结果就是三个“口”字。
还有一种常用的编码是 base64 编码,base64编码本来是为了在 email 这样的非纯 8-bit 的传输层传输二进制数据而设计出来的,这样就可以在 email 中传递二进制的附件。它用 a-z A-Z 0-9 +/= 这64个字符来表示原有的数据,并且将连续的三个字符编码为四个,长度增加33%。 这个编码方式在一些比较超前的 javascript 应用中比较常用,例如 这个超级玛丽游戏 ,它里面的音乐就是写 javascript 文件中的。例如 这个 利用 canvas 作图的例子,里面的头像也是写在 javascript 源代码中的。这就是 RFC 2397 规定的 data URIs 协议,Firefox 浏览器支持,IE8也开始部分支持了,利用 data URIs 和 base64 编码,我们可以不借助任何外来的音乐、图像等多媒体文件而创造出丰富的效果。
以上就是我想介绍的 javascript 和 html 中常用到的编码和原理,最后还想提到一句,很多的黑客行为都和编码有关,用编码后的代码来通过一些简单的过滤,如下js代码:
var a = ‘口碑’; \u0061 = ‘koubei.com’; alert(a); //get ‘koubei.com’
当然,黑客们会有更专业的方式来逃避过滤、注入代码(如 sql injection, XSS 攻击等)。
谢谢大家的阅读,我是 stauren, 雅虎口碑UED团队的前端开发工程师粽子,这是我第一次在Koubei的UED blog上发表文章,如果有错误的地方请大家指出。同时欢迎访问我的个人blog : http://stauren.net, 并且提供在线 Hex、NCR、Percent encode、Base64编码解码工具:http://stauren.net/lab
本文链接:http://www.blueidea.com/tech/web/2008/6343.asp
出处:口碑网UED Team
责任编辑:bluehearts
上一页 HTML与javascript中常用编码浅析 [2] 下一页
◎进入论坛网页制作、WEB标准化版块参加讨论,我还想发表评论。
|