如何禁止url中使用""或它的中文转unicode编码码

| 时间排序
这个问题涉及到URL的定义。我们知道URL是为了 统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用)。&br&&br&所以这就要求URL有一些基本的特性:&br&&ul&&li&URL是可移植的。(所有的网络协议都可以使用URL)&/li&&li&URL的完整性。(不能丢失数据,比如URL中包含二进制数据时,如何处理)&/li&&li&URL的可阅读性。(希望人能阅读)&/li&&/ul&因为一些历史的原因URL设计者使用US-ASCII字符集表示URL。(原因比如ASCII比较简单;所有的系统都支持ASCII)&br&&br&为了满足URL的以上特性,设计者就将转义序列移植了进去,来实现通过ASCII字符集的有限子集对任意字符或数据进行编码。&br&&br&URL转义表示法包含一个百分号,后面跟上两个表示字符ASCII码的十六进制数值。&br&&br&现在URL转义表示法比较常用的有两个:&br&&ul&&li&&a href=&///?target=https%3A//tools.ietf.org/html/rfc2396& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax&i class=&icon-external&&&/i&&/a&&/li&&li&&a href=&///?target=https%3A//tools.ietf.org/html/rfc3986& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RFC 3986 - Uniform Resource Identifier (URI): Generic Syntax&i class=&icon-external&&&/i&&/a&&br&&/li&&/ul&&br&以下是RFC3986中对转义部分的一些定义:&br&&img src=&/b56b8bced53bf82a0d4af5c2bd9dfc6f_b.png& data-rawwidth=&848& data-rawheight=&193& class=&origin_image zh-lightbox-thumb& width=&848& data-original=&/b56b8bced53bf82a0d4af5c2bd9dfc6f_r.png&&&br&&i&Reserved&/i& characters are those characters that sometimes have special meaning。&br&&i&Unreserved&/i& characters have no such meanings。&br&就是说在RFC3986中&i&Unreserved&/i& characters部分的字符是不需要转义的其他都需要。&br&&br&PS:不同的编程语言对于URL的转义还不一样。比如Java中的URLEncoder是按照RFC2398转义,PHP5中的rawurlencode是按照RFC3986转义。&br&&br&&br&Reference:&br&&ul&&li&&a href=&///?target=https%3A//en.wikipedia.org/wiki/Percent-encoding& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Percent-encoding&i class=&icon-external&&&/i&&/a&&br&&/li&&li&HTTP权威指南 2.4章&/li&&/ul&
这个问题涉及到URL的定义。我们知道URL是为了 统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用)。所以这就要求URL有一些基本的特性:URL是可移植的。(所有的网络协议都可以使用URL)URL的完整性。(不能…
有可能是volley又再帮你encode一次了.你试试不要自己encode.没用过Volley.这是猜的.
有可能是volley又再帮你encode一次了.你试试不要自己encode.没用过Volley.这是猜的.
标题为“置顶置顶~~~~~~~~~”也会出现乱码的情况,尚未解决
标题为“置顶置顶~~~~~~~~~”也会出现乱码的情况,尚未解决
正好遇到类似问题,我在 这里 &a href=&///?target=http%3A///blog/2010/02/url_encoding.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&关于URL编码 - 阮一峰的网络日志&i class=&icon-external&&&/i&&/a&
找到了解决办法,希望能帮助到你。
正好遇到类似问题,我在 这里
找到了解决办法,希望能帮助到你。
Unicode编码格式,%xy表示一个汉字,其中x或y代表数字或大写英文字母。
Unicode编码格式,%xy表示一个汉字,其中x或y代表数字或大写英文字母。
用ifile var / mobile / applications / 你要的应用 / 应用名字.app / 搜索 info.plist / 文本编辑器打开 搜索 url
找到结果得下一行 两个&string &之间的就是 动作的话 看软件供应商的官方文档
用ifile var / mobile / applications / 你要的应用 / 应用名字.app / 搜索 info.plist / 文本编辑器打开 搜索 url 找到结果得下一行 两个&string &之间的就是 动作的话 看软件供应商的官方文档
&a href=&///?target=http%3A//en.wikipedia.org/wiki/Percent-encoding& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Percent-encoding&i class=&icon-external&&&/i&&/a&&br&%24用来代替ASCII码为十六进制24的字符($),余类推。
%24用来代替ASCII码为十六进制24的字符($),余类推。
如果参数的传输的过程中用明文,也就是说你想传啥就传啥,那有个问题,就是路径都是用“/”分隔的,正好,你的参数里有个&/&,咋办?接收到的怎么知道这是真的需要下一级路径,还是一个参数?为了解决这种问题,就采取了转义字符,就是将明文转换成这种你不理解的类似乱码的字符。
如果参数的传输的过程中用明文,也就是说你想传啥就传啥,那有个问题,就是路径都是用“/”分隔的,正好,你的参数里有个"/",咋办?接收到的怎么知道这是真的需要下一级路径,还是一个参数?为了解决这种问题,就采取了转义字符,就是将明文转换成这种你不…
中文域名都会被转码,这种编码叫做punycode &a href=&///?target=http%3A///view/1704366.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Punycode_百度百科&i class=&icon-external&&&/i&&/a&&br&我发现这种域名的问题就是如果你不显式在地址栏写上http://就会有一定几率被浏览器内置的搜索引擎所搜索&br&比如这里就可以转 &a href=&///?target=http%3A//www.dreamspeed.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&中文域名在线转码工具&i class=&icon-external&&&/i&&/a&&br&&br&既然会被转码,那么理论上任何unicode字符都可以做域名,见猥琐的xsser们的域名可以短到什么地步 &a href=&///?target=http%3A//drops.wooyun.org/tips/2839& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&短域名进化史&i class=&icon-external&&&/i&&/a&
中文域名都会被转码,这种编码叫做punycode 我发现这种域名的问题就是如果你不显式在地址栏写上http://就会有一定几率被浏览器内置的搜索引擎所搜索比如这里就可以转 既然会被转码,那么理论上任何unicode字符都可以…
&a href=&///?target=https%3A//zh.wikipedia.org/wiki/%25E5%259B%25BD%25E9%E5%258C%%259F%259F%25E5%D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&国际化域名&i class=&icon-external&&&/i&&/a&&br&看
prefs:root=VPN 找到了~
prefs:root=VPN 找到了~
那个应该是OpenVPN才用得上。
那个应该是OpenVPN才用得上。
那个地址是生成图片的文件,不是图片文件本身,你靠那个地址是下载不了的
那个地址是生成图片的文件,不是图片文件本身,你靠那个地址是下载不了的
根据其编码的方式写了一个解码的函数:&br&&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&decode&/span& &span class=&o&&=&/span& &span class=&kd&&function&/span&&span class=&p&&(&/span&&span class=&nx&&m&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&k&&try&/span& &span class=&p&&{&/span&
&span class=&nx&&m&/span& &span class=&o&&=&/span& &span class=&nb&&decodeURIComponent&/span&&span class=&p&&(&/span&&span class=&nx&&m&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span& &span class=&k&&catch&/span&&span class=&p&&(&/span&&span class=&nx&&e&/span&&span class=&p&&)&/span& &span class=&p&&{}&/span&
&span class=&kd&&var&/span& &span class=&nx&&s&/span& &span class=&o&&=&/span& &span class=&nx&&m&/span&&span class=&p&&.&/span&&span class=&nx&&split&/span&&span class=&p&&(&/span&&span class=&s2&&&%&&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&s&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span& &span class=&o&&&&/span& &span class=&mi&&1&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&nx&&s&/span&&span class=&p&&.&/span&&span class=&nx&&shift&/span&&span class=&p&&();&/span&
&span class=&k&&for&/span&&span class=&p&&(&/span&&span class=&kd&&var&/span& &span class=&nx&&i&/span& &span class=&o&&=&/span& &span class=&mi&&0&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span& &span class=&o&&&&/span& &span class=&nx&&s&/span&&span class=&p&&.&/span&&span class=&nx&&length&/span&&span class=&p&&;&/span& &span class=&nx&&i&/span&&span class=&o&&++&/span&&span class=&p&&)&/span& &span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&s&/span&&span class=&p&&[&/span&&span class=&nx&&i&/span&&span class=&p&&];&/span&
&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nb&&parseInt&/span&&span class=&p&&(&/span&&span class=&nx&&t&/span&&span class=&p&&,&/span& &span class=&mi&&16&/span&&span class=&p&&);&/span&
&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&t&/span& &span class=&o&&+&/span& &span class=&mi&&256&/span&&span class=&p&&;&/span&
&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&t&/span& &span class=&o&&-&/span& &span class=&mi&&201&/span&&span class=&p&&;&/span&
&span class=&nx&&t&/span& &span class=&o&&=&/span& &span class=&nx&&t&/span&&span class=&p&&.&/span&&span class=&nx&&toString&/span&&span class=&p&&(&/span&&span class=&mi&&16&/span&&span class=&p&&);&/span&
&span class=&nx&&s&/span&&span class=&p&&[&/span&&span class=&nx&&i&/span&&span class=&p&&]&/span& &span class=&o&&=&/span& &span class=&nx&&t&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&nx&&m&/span& &span class=&o&&=&/span& &span class=&s1&&'%'&/span&&span class=&o&&+&/span&&span class=&nx&&s&/span&&span class=&p&&.&/span&&span class=&nx&&join&/span&&span class=&p&&(&/span&&span class=&s1&&'%'&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&nb&&decodeURIComponent&/span&&span class=&p&&(&/span&&span class=&nx&&m&/span&&span class=&p&&);&/span&
&span class=&p&&}&/span& &span class=&k&&else&/span& &span class=&p&&{&/span&
&span class=&k&&return&/span& &span class=&nx&&m&/span&&span class=&p&&;&/span&
&span class=&p&&}&/span&
&span class=&p&&}&/span&
&/code&&/pre&&/div&
根据其编码的方式写了一个解码的函数:var decode = function(m) {
m = decodeURIComponent(m);
} catch(e) {}
var s = m.split("%");
if (s.length & 1) {
s.shift();
for(var i = 0; i & s. i++) {
var t = s[i];
t = parse…
encodeURIComponent后增加位移
encodeURIComponent后增加位移
已有帐号?
社交帐号登录
无法登录?
社交帐号登录url编码规范_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
url编码规范
上传于||暂无简介
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩5页未读,继续阅读
你可能喜欢概述:导读:网站URL路径一般都是用英文来表述,不过在国内很多情况下能看到网页URL中使用中文,因此中文的编码就会成为网站路径的问题。
导读:网站URL路径一般都是用英文来表述,不过在国内很多情况下能看到网页URL中使用中文,因此中文的编码就会成为网站路径的问题。&一、问题的由来。URL就是网址,只要上网,就一定会用到。一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。比如,世界上有英文字母的网址
&&,但是没有希腊字母的网址&http://www.a&&.com&(读作阿尔法-贝塔-伽玛.com)。这是
因为网络标准RFC 1738做了硬性规定:&&Only alphanumerics [0-9a-zA-Z], the special characters
&$-_.+!*&(),& [not including the quotes - ed], and reserved characters
their reserved purposes may be used unencoded within a URL.&&只有字母和数字[0-9a-zA-Z]、一些特殊符号&$-_.+!*&(),&[不包括双引号]、以及某些保留字,才可以不经过编码直接用于URL。&这意味着,如果URL中有汉字,就必须编码后使用。但是麻烦的是,RFC
1738没有规定具体的编码方法,而是交给应用程序(浏览器)自己决定。这导致&URL编码&成为了一个混乱的领域。下面就让我们看看,&URL编码&到底有多混乱。我会依次分析四种不同的情况,在每一种情况中,浏览器的URL编码方法都不一样。把它们的差异解释清楚之后,我再说如何用Javascript找到一个统一的编码方法。& 二、情况1:网址路径中包含汉字。打开IE(我用的是8.0版),输入网址&http://zh.wikipedia.org/wiki/春节&。注意,&春节&这两个字此时是网址路径的一部分。查看HTTP请求的头信息,会发现IE实际查询的网址是&http://zh.wikipedia.org/wiki/%E6%98%A5%E8%8A%82&。也就是说,IE自动将&春节&编码成了&%E6%98%A5%E8%8A%82&。我们知道,&春&和&节&的utf-8编码分别是&E6 98
A5&和&E8 8A 82&,因此,&%E6%98%A5%E8%8A%82&就是按照顺序,在每个字节前加上%而得到的。(具体的转码方法,请参考我写的。)在Firefox中测试,也得到了同样的结果。所以,结论1就是,网址路径的编码,用的是utf-8编码。三、情况2:查询字符串包含汉字。在IE中输入网址&/s?wd=春节&。注意,&春节&这两个字此时属于查询字符串,不属于网址路径,不要与情况1混淆。查看HTTP请求的头信息,会发现IE将&春节&转化成了一个乱码。切换到十六进制方式,才能清楚地看到,&春节&被转成了&B4 BA BD DA&。我们知道,&春&和&节&的GB2312编码(我的操作系统&Windows
XP&中文版的默认编码)分别是&B4 BA&和&BD DA&。因此,IE实际上就是将查询字符串,以GB2312编码的格式发送出去。Firefox的处理方法,略有不同。它发送的HTTP Head是&wd=%B4%BA%BD%DA&。也就是说,同样采用GB2312编码,但是在每个字节前加上了%。所以,结论2就是,查询字符串的编码,用的是操作系统的默认编码。四、情况3:Get方法生成的URL包含汉字。前面说的是直接输入网址的情况,但是更常见的情况是,在已打开的网页上,直接用Get或Post方法发出HTTP请求。这时的编码方法由网页的编码决定,也就是由HTML源码中字符集的设定决定。&meta http-equiv=&Content-Type&
content=&text/charset=xxxx&&如果上面这一行最后的charset是UTF-8,则URL就以UTF-8编码;如果是GB2312,URL就以GB2312编码。举例来说,百度是GB2312编码,Google是UTF-8编码。因此,从它们的搜索框中搜索同一个词&春节&,生成的查询字符串是不一样的。百度生成的是%B4%BA%BD%DA,这是GB2312编码。Google生成的是%E6%98%A5%E8%8A%82,这是UTF-8编码。所以,结论3就是,GET和POST方法的编码,用的是网页的编码。五、情况4:Ajax调用的URL包含汉字。前面三种情况都是由浏览器发出HTTP请求,最后一种情况则是由Javascript生成HTTP请求,也就是Ajax调用。还是根据吕瑞麟老师的文章,在这种情况下,IE和Firefox的处理方式完全不一样。举例来说,有这样两行代码:url = url + &?q=& +document.myform.elements[0]. // 假定用户在表单中提交的值是&春节&这两个字http_request.open(&GET&, url, true);那么,无论网页使用什么字符集,IE传送给服务器的总是&q=%B4%BA%BD%DA&,而Firefox传送给服务器的总是&q=%E6%98%A5%E8%8A%82&。也就是说,在Ajax调用中,IE总是采用GB2312编码(操作系统的默认编码),而Firefox总是采用utf-8编码。这就是我们的结论4。六、Javascript函数:escape()。好了,到此为止,四种情况都说完了。假定前面你都看懂了,那么此时你应该会感到很头痛。因为,实在太混乱了。不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。如 果程序员要把每一种结果都考虑进去,是不是太恐怖了?有没有办法,能够保证客户端只用一种编码方法向服务器发出请求?回答是有的,就是使用Javascript先对URL编码,然后再向服务器提交,不要给浏览器插手的机会。因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。Javascript语言用于编码的函数,一共有三个,最古老的一个就是escape()。虽然这个函数现在已经不提倡使用了,但是由于历史原因,很多地方还在使用它,所以有必要先从它讲起。实际上,escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值。比如&春节&的返回结果
是%u,也就是说在Unicode字符集中,&春&是第6625个(十六进制)字符,&节&是第8282个(十六进制)字符。它的具体规则是,除了ASCII字母、数字、标点符号&@ * _ + -
. /&以外,对其他所有字符进行编码。在\u0000到\u00ff之间的符号被转成%xx的形式,其余符号被转成%uxxxx的形式。对应的解码函数是unescape()。所以,&Hello World&的escape()编码就是&Hello%20World&。因为空格的Unicode值是20(十六进制)。还有两个地方需要注意。首先,无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符。这一点对下面两个函数也适用。其次,escape()不对&+&编码。但是我们知道,网页在提交表单的时候,如果有空格,则会被转化为+字符。服务器处理数据的时候,会把+号处理成空格。所以,使用的时候要小心。七、Javascript函数:encodeURI()。encodeURI()是Javascript中真正用来对URL编码的函数。它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号&; / ? : @ & = + $ , #&,也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%。它对应的解码函数是decodeURI()。需要注意的是,它不对单引号&编码。八、Javascript函数:encodeURIComponent()。最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。因此,&; / ? : @ & = + $ , #&,这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。它对应的解码函数是decodeURIComponent()。相关阅读:&
分类:| 标签:&&&&&&| 查看:
| 发表时间:
本文地址:(转载请保留网址)
感谢写得很不错,来看看了解一下。欢迎回访
龙临天下推出最新的本地话费套餐——1分钱/分钟!!赶快办理吧,详情请登陆
了解,或拨打400-
最近博客为什么都那么难登陆?什么情况?jenryl 于
10:08:33 回复我的博客吗?
向博主学习了,很深渊的学问,要常来看看,学习博主的敬业精神和学识的丰富广泛。jenryl 于
10:09:02 回复欢迎常来哈!
什么是RSS订阅?
订阅到您的在线阅读器
# 联系QQ:&&&&&&# 邮箱:
# 标签:28推、网站推广、网站优化、网络营销、seowhy
# 刘稻 / 优化推广/ QQ群: (加群交流)
# 实时关注:订阅本博客到你的 QQ 邮箱
Powered By & Template
Designed By&&&&url编码转化,将url转化成unicode进行传输
&url编码转化,将url转化成unicode进行传输
对url进行编码转换,在实际应用中url的传输的是unicode的编码,因此每次提交url之前需要将其转化
这里是C/C++版的url转化,使用的是char格式的转换,但便于操作在最后将其转化为CString传输,可以根据需要对其进行简单的修改
若举报审核通过,可奖励20下载分
被举报人:
tonightelvis
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
免积分&&极速下载60元/年(1200次)
您可能还需要
Q.为什么我点的下载下不了,但积分却被扣了
A. 由于下载人数众多,下载服务器做了并发的限制。若发现下载不了,请稍后再试,多次下载是不会重复扣分的。
Q.我的积分不多了,如何获取积分?
A. 获得积分,详细见。
完成任务获取积分。
论坛可用分兑换下载积分。
第一次绑定手机,将获得5个C币,C币可。
关注并绑定CSDNID,送10个下载分
下载资源意味着您已经同意遵守以下协议
资源的所有权益归上传用户所有
未经权益所有人同意,不得将资源中的内容挪作商业或盈利用途
CSDN下载频道仅提供交流平台,并不能对任何下载资源负责
下载资源中如有侵权或不适当内容,
本站不保证本站提供的资源的准确性,安全性和完整性,同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
开发技术下载排行
您当前C币:0&&&可兑换 0 下载积分
兑换下载分:&
消耗C币:0&
立即兑换&&
兑换成功你当前的下载分为 。前去下载资源
你下载资源过于频繁,请输入验证码
如何快速获得积分?
你已经下载过该资源,再次下载不需要扣除积分
url编码转化,将url转化成unicode进行传输
所需积分:1
剩余积分:0
扫描微信二维码精彩活动、课程更新抢先知
VIP会员,免积分下载
会员到期时间:日
剩余下载次数:1000
url编码转化,将url转化成unicode进行传输
剩余次数:&&&&有效期截止到:
你还不是VIP会员VIP会员享免积分 . 专属通道极速下载
VIP下载次数已满VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员
你的VIP会员已过期VIP会员享免积分 . 专属通道极速下载,请继续开通VIP会员您的位置: >>
  通常如果一样东西需要编码,说明这样东西并不适合传输。原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义。
  例如,Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码。
  又如,Url的编码格式采用的是ASCII码,而不是Unicode,这也就是说你不能在Url中包含任何非ASCII字符,例如中文。否则如果客户端浏览器和服务端浏览器支持的字符集不同的情况下,中文可能会造成问题。
Url编码的原则就是使用安全的字符(没有特殊用途或者特殊意义的可打印字符)去表示那些不安全的字符。
  预备知识:URI是统一资源标识的意思,通常我们所说的URL只是URI的一种。典型URL的格式如下所示。下面提到的URL编码,实际上应该指的是URI编码。
foo://:8042/over/there?name=ferret#nose
& &\_/ \______________/ \________/\_________/ \__/
& &&|&&&&&&&& |&&&&&&&&&&&&& |&&&&&&&& |&&&&&&& |
& scheme&&&& authority & & & & & & & &path & & &query&& fragment
  哪些字符需要编码
  RFC3986文档规定,Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。RFC3986文档对Url的编解码问题做出了详细的建议,指出了哪些字符需要被编码才不会引起Url语义的转变,以及对为什么这些字符需要编码做出了相应的解释。
  US-ASCII字符集中没有对应的可打印字符:Url中只允许使用可打印字符。US-ASCII码中的10-7F字节全都表示控制字符,这些字符都不能直接出现在Url中。同时,对于80-FF字节(ISO-8859-1),由于已经超出了US-ACII定义的字节范围,因此也不可以放在Url中。
  保留字符:Url可以划分成若干个组件,协议、主机、路径等。有一些字符(:/?#[]@)是用作分隔不同组件的。例如:冒号用于分隔协议和主机,/用于分隔主机和路径,?用于分隔路径和查询参数,等等。还有一些字符(!$&'()*+,;=)用于在每个组件中起到分隔作用的,如=用于表示查询参数中的键值对,&符号用于分隔查询多个键值对。当组件中的普通数据包含这些特殊字符时,需要对其进行编码。
  RFC3986中指定了以下字符为保留字符:! * ' ( ) ; : @ & = + $ , / ? # [ ]
  不安全字符:还有一些字符,当他们直接放在Url中的时候,可能会引起解析程序的歧义。这些字符被视为不安全字符,原因有很多。
空格:Url在传输的过程,或者用户在排版的过程,或者文本处理程序在处理Url的过程,都有可能引入无关紧要的空格,或者将那些有意义的空格给去掉。
引号以及&&:引号和尖括号通常用于在普通文本中起到分隔Url的作用
#:通常用于表示书签或者锚点
%:百分号本身用作对不安全字符进行编码时使用的特殊字符,因此本身需要编码
{}|\^[]`~:某一些网关或者传输代理会篡改这些字符
  需要注意的是,对于Url中的合法字符,编码和不编码是等价的,但是对于上面提到的这些字符,如果不经过编码,那么它们有可能会造成Url语义的不同。因此对于Url而言,只有普通英文字符和数字,特殊字符$-_.+!*'()还有保留字符,才能出现在未经编码的Url之中。其他字符均需要经过编码之后才能出现在Url中。
  但是由于历史原因,目前尚存在一些不标准的编码实现。例如对于~符号,虽然RFC3986文档规定,对于波浪符号~,不需要进行Url编码,但是还是有很多老的网关或者传输代理会进行编码。
  如何对Url中的非法字符进行编码
  Url编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用%百分号加上两位的字符&&ABCDEF&&代表一个字节的十六进制形式。Url编码默认使用的字符集是US-ASCII。例如a在US-ASCII码中对应的字节是0x61,那么Url编码之后得到的就是%61,我们在地址栏上输入http://g.cn/search?q=%61%62%63,实际上就等同于在google上搜索abc了。又如@符号在ASCII字符集中对应的字节为0x40,经过Url编码之后得到的是%40。
  对于非ASCII字符,需要使用ASCII字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于Unicode字符,RFC文档建议使用utf-8对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如"中文"使用UTF-8字符集得到的字节为0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过Url编码之后得到"%E4%B8%AD%E6%96%87"。
  如果某个字节对应着ASCII字符集中的某个非保留字符,则此字节无需使用百分号表示。例如"Url编码",使用UTF-8编码得到的字节是0x55 0x72 0x6C 0xE7 0xBC 0x96 0xE7 0xA0 0x81,由于前三个字节对应着ASCII中的非保留字符"Url",因此这三个字节可以用非保留字符"Url"表示。最终的Url编码可以简化成"Url%E7%BC%96%E7%A0%81" ,当然,如果你用"%55%72%6C%E7%BC%96%E7%A0%81"也是可以的。
  由于历史的原因,有一些Url编码实现并不完全遵循这样的原则,下面会提到。
  Javascript中的escape, encodeURI和encodeURIComponent的区别
  Javascript中提供了3对函数用来对Url编码以得到合法的Url,它们分别是escape / unescape, encodeURI / decodeURI和encodeURIComponent / decodeURIComponent。由于解码和编码的过程是可逆的,因此这里只解释编码的过程。
  这三个编码的函数&&escape,encodeURI,encodeURIComponent&&都是用于将不安全不合法的Url字符转换为合法的Url字符表示,它们有以下几个不同点。
  安全字符不同:
  下面列出了这三个函数的安全字符(即函数不会对这些字符进行编码)
escape(69个):*/@+-._0-9a-zA-Z
encodeURI(82个):!#$&'()*+,/:;=?@-._~0-9a-zA-Z
encodeURIComponent(71个):!'()*-._~0-9a-zA-Z
  兼容性不同:escape函数是从Javascript 1.0的时候就存在了,其他两个函数是在Javascript 1.5才引入的。但是由于Javascript 1.5已经非常普及了,所以实际上使用encodeURI和encodeURIComponent并不会有什么兼容性问题。
  对Unicode字符的编码方式不同:这三个函数对于ASCII字符的编码方式相同,均是使用百分号+两位十六进制字符来表示。但是对于Unicode字符,escape的编码方式是%uxxxx,其中的xxxx是用来表示unicode字符的4位十六进制字符。这种方式已经被W3C废弃了。但是在ECMA-262标准中仍然保留着escape的这种编码语法。encodeURI和encodeURIComponent则使用UTF-8对非ASCII字符进行编码,然后再进行百分号编码。这是RFC推荐的。因此建议尽可能的使用这两个函数替代escape进行编码。
  适用场合不同:encodeURI被用作对一个完整的URI进行编码,而encodeURIComponent被用作对URI的一个组件进行编码。从上面提到的安全字符范围表格来看,我们会发现,encodeURIComponent编码的字符范围要比encodeURI的大。我们上面提到过,保留字符一般是用来分隔URI组件(一个URI可以被切割成多个组件,参考预备知识一节)或者子组件(如URI中查询参数的分隔符),如:号用于分隔scheme和主机,?号用于分隔主机和路径。由于encodeURI操纵的对象是一个完整的的URI,这些字符在URI中本来就有特殊用途,因此这些保留字符不会被encodeURI编码,否则意义就变了。
  组件内部有自己的数据表示格式,但是这些数据内部不能包含有分隔组件的保留字符,否则就会导致整个URI中组件的分隔混乱。因此对于单个组件使用encodeURIComponent,需要编码的字符就更多了。
  表单提交
  当Html的表单被提交时,每个表单域都会被Url编码之后才在被发送。由于历史的原因,表单使用的Url编码实现并不符合最新的标准。例如对于空格使用的编码并不是%20,而是+号,如果表单使用的是Post方法提交的,我们可以在HTTP头中看到有一个Content-Type的header,值为application/x-www-form-urlencoded。大部分应用程序均能处理这种非标准实现的Url编码,但是在客户端Javascript中,并没有一个函数能够将+号解码成空格,只能自己写转换函数。还有,对于非ASCII字符,使用的编码字符集取决于当前文档使用的字符集。例如我们在Html头部加上
&meta http-equiv="Content-Type" content="text/ charset=gb2312" /&
  这样浏览器就会使用gb2312去渲染此文档(注意,当HTML文档中没有设置此meta标签,则浏览器会根据当前用户喜好去自动选择字符集,用户也可以强制当前网站使用某个指定的字符集)。当提交表单时,Url编码使用的字符集就是gb2312。
  之前在使用Aptana(为什么专指aptana下面会提到)遇到一个很迷惑的问题,就是在使用encodeURI的时候,发现它编码得到的结果和我想的很不一样。下面是我的示例代码:
&!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&&html xmlns="http://www.w3.org/1999/xhtml"&
&meta http-equiv="Content-Type" content="text/ charset=gb2312" /&
&script type="text/javascript"&
document.write(encodeURI("中文"));
&/body&&/html&
  运行结果输出%E6%B6%93%EE%85%9F%E6%9E%83。显然这并不是使用UTF-8字符集进行Url编码得到的结果(在Google上搜索"中文",Url中显示的是%E4%B8%AD%E6%96%87)。
  所以我当时就很质疑,难道encodeURI还跟页面编码有关,但是我发现,正常情况下,如果你使用gb2312进行Url编码也不会得到这个结果的才是。后来终于被我发现,原来是页面文件存储使用的字符集和Meta标签中指定的字符集不一致导致的问题。Aptana的编辑器默认情况下使用UTF-8字符集。也就是说这个文件实际存储的时候使用的是UTF-8字符集。但是由于Meta标签中指定了gb2312,这个时候,浏览器就会按照gb2312去解析这个文档,那么自然在"中文"这个字符串这里就会出错,因为"中文"字符串用UTF-8编码过后得到的字节是0xE4 0xB8 0xAD 0xE6 0x96 0x87,这6个字节又被浏览器拿gb2312去解码,那么就会得到另外三个汉字"涓?枃"(GBK中一个汉字占两个字节),这三个汉字在传入encodeURI函数之后得到的结果就是%E6%B6%93%EE%85%9F%E6%9E%83。因此,encodeURI使用的还是UTF-8,并不会受到页面字符集的影响。
  对于包含中文的Url的处理问题,不同浏览器有不同的表现。例如对于IE,如果你勾选了高级设置"总是以UTF-8发送Url",那么Url中的路径部分的中文会使用UTF-8进行Url编码之后发送给服务端,而查询参数中的中文部分使用系统默认字符集进行Url编码。为了保证最大互操作性,建议所有放到Url中的组件全部显式指定某个字符集进行Url编码,而不依赖于浏览器的默认实现。
  另外,很多HTTP监视工具或者浏览器地址栏等在显示Url的时候会自动将Url进行一次解码(使用UTF-8字符集),这就是为什么当你在Firefox中访问Google搜索中文的时候,地址栏显示的Url包含中文的缘故。但实际上发送给服务端的原始Url还是经过编码的。你可以在地址栏上使用Javascript访问location.href就可以看出来了。在研究Url编解码的时候千万别被这些假象给迷惑了。
Web前端热门文章
Web前端最新文章}

我要回帖

更多关于 url编码 26quot 3b 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信