HTML与javascript中常用编码浅析(3)
作者:stauren 来源:口碑网UED Team 发布时间:2008-12-23 12:20:00
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 攻击等)。
猜你喜欢
- 此文主要讲述的是SQL Server连接中经常出现的3个常见错误,以及对这三个错误的详细分析,如果你其心存好奇的话,以下的文章将会揭开它的神
- 最近在这找了好久的js菜单,都没找到满意的,今天找了个,觉得不错,最重要的是简单,希望大家可以参照一下先看看效果图吧:代码特点:js+css
- 当成功安装了PHP,MYSQL后,我们一般要安装phpMyAdmin来管理你的mysql。本文介绍了phpMyAdmin 2.10.2的配置
- 这个仿msn的右下角popup提示窗口效果很久以前收集的,现在整理出来给大家分享,需要的朋友可以拿去用,特点,提示窗口内容和js代码分离容易
- JQuery Solar System 是一个用JQuery写的东西,效果真是cool ! 没想到使用Javascript 也可以做到这种效
- 一直以来都对DOMDocument与 XMLHTTP 两者的区别不甚了解,今天用 eXeScope 查看了msxml6.dll 内
- 在给客户做个程序时,突然遇到个问题,就是产品页用户提交视频播放文件时,如何根据提交的网址内的视频格式进行正确的播放呢....郁闷了一会,想好
- 人们很容易忽视图像img标签的alt属性。然而,它的重要性也无法体现出来,它是有利于网页的accessibility and&nb
- 在实现TextStraem的时候,找到判断文件编码的代码是VBS的,但是在JScript中是没有ASC等函数的,也不能对二进制数据进行处理,
- Translate From:stevesouders原文:高性能网站设计:不要使用@import在高性能网站设计的第五章,我简要的提到@i
- SQL SERVER数据存储的形式在谈到几种不同的读取方式之前,首先要理解SQL SERVER数据存储的方式.SQL SERVER存储的最小
- 一、为图片添加水印 代码如下:<% Dim Jpeg ””//声明变量 Set Jpeg = Server.CreateObject(
- 众所周知,凡是用 FrontPage 做的网页里面都有类似这样的标记:<META content="Microso
- 或许你已经看过很多关于CSS3动画的技术,包括前端观察之前发表的一些,那么现在就情看一看CSS3动画的魅力吧。这里是一辑47个令人瞠目结舌的
- 如何验证信用卡是否可用,合法? 核实信用卡的真伪是一件麻烦的事儿,看看下面的代码,也许会给你帮上忙:<Script 
- * 前,我在公司做设计,当时就已经做到技术总监,Photoshop是自学的,当时觉得全世界比我Photoshop强的人也不在多数。七年前,
- 请问如何在ASP中使用ADO调用Oracle的存储过程?我们可以在下面的代码里使用微软Oracle 的OLE DB Provider ,包括
- 在这篇文章中,我将努力揭开Mobile Web开发的神秘面纱,换句话说,也就是为了移动设备上的用户体验可以被接受,代码得怎么设计。我将阐述“
- 关于本文:本着互联网共享主义精神,特写此文献给建站新手,授人以鱼,不如授人以渔,本文所讲的只是方法和原理,希望大家看完此文,能够从中得到些帮
- 首先建一个access 数据库,库中有一个URLINDEX表,其中URL和Keywords字段分别添加了索引,如下:URL &nb