网络编程
位置:首页>> 网络编程>> 网页设计>> HTML与javascript中常用编码浅析(3)

HTML与javascript中常用编码浅析(3)

作者:stauren 来源:口碑网UED Team 发布时间:2008-12-23 12:20:00 

标签:编码,javascript,html,前端

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>
&#21475;
&#021475;
&#x53e3;
</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 攻击等)。

0
投稿

猜你喜欢

手机版 网络编程 asp之家 www.aspxhome.com