网络编程
位置:首页>> 网络编程>> JavaScript>> URL编码“陷阱”

URL编码“陷阱”

作者:LuLi 来源:SimpleLife 发布时间:2008-03-04 16:57:00 

标签:url,编码,字符

上次谈到客户端和服务端的编码“陷阱”,其中对url编码只是提及带过,并没有做深入讨论,事实上由于浏览器环境的复杂和不一致性,我们也很容易掉进url编码“陷阱”。首先看一个demo,我的测试是在FF和IE6上进行的。

在FF下表现正常,而在IE6下当点击第一个链接的时候,服务端给我们返回的id变量值竟然出现了怪异,和我们传递过去的“实验室”不一致,这看起来似乎很怪异。整个过程中我对get过来的参数id除了做输出,没有做任何额外处理,上面的怪异现象实际上是浏览器造成的。
  
  一、URL编码需要指定被编码字符的字符集

首先我们要明确的是在对ASCII码以外的字符做URL编码时,你要清楚的知道被编码的字符的字符集,这点很重要。例如我们要对“汉字”这两个字符做URL编码,你可能得到的是“%E6%B1%89%E5%AD%97”,也可能是“%BA%BA%D7%D6”。为何会有两个了?事实上还有更多。前者是UTF8下“汉字”的URL编码,后者是GB2312下“汉字”的URL编码。如果客户端是针对字符集A做的URL编码,而服务端默认是以字符集B处理,那显然就掉进陷阱了。(PS:随后有一个测试可以看到)
  
  1、页面中的字符编码

当服务端将页面代码发送给客户端并显示在浏览器里时,该页面中的字符编码就已经确定了,它可能是服务端在header中直接指定的,也可能是在页面的meta信息中设置了charset,具体见客户端和服务端的编码“陷阱”中的第一和第二点分析。以上面那个怪异的demo为例,页面的字符集是utf-8,当点击第一个“实验室”链接时,IE6地址栏是“http://www.v-sky.com/demo/urlencode.php?id=实验室”,而FF下是“http://www.v-sky.com/demo/urlencode.php?id=%E5%AE%9E%E9%AA%8C%E5%AE%A4”,对比可知,对于链接中的非ASCII码IE是“不会”做处理的(PS:事实上IE的编码过程是在背后进行的,没有在地址栏展现给浏览者而已),而FF会根据字符本身的字符集做URL编码(PS:你可以将此页面字符集设置为GB2312以后测试,FF下的地址栏会变成GB2312对应的URL编码)

2、URL地址栏中的字符编码
  
  同样在针对上面的怪异demo,刚才我们都是通过点击链接请求一个新的URL来传递参数,现在我们直接在地址栏中给id输入参数“实验室”,然后回车察看结果。你会发现无论是IE还是FF,服务端输出的变量都是乱码,在FF的地址栏中我们可以看到这里是针对GB2312字符集的“实验室”做的URL编码,而服务端是以UTF8编码处理的,这就造成了输出乱码,前面提到的陷阱出现了。
  
  简单来说就是浏览器中输入字符的编码是根据浏览器和用户在浏览器上的个人设置来确定的,这里有一个详细的说明,我没有对各种情况都做测试,因为首先我不会用非ASCII码命名文件,其次非ASCII码的传参随后有更好的解决方案。

二、对ASCII码以外的特殊字符统一编码
  
  实际项目中很少会出现包含非ASCII码的链接,能够避免这种情况最好,尤其是希望用户容易访问的地址更应当考虑易用性。但如果你真的因为某些原因无法避免,那么你只有主动对这些特殊URL进行统一的URL编码,避免IE这样的浏览器来捣乱,就跟demo中的第二个链接的做法一样。

对于接受用户输入而构造出来的URL请求,例如搜索引擎入口,至少会GET传递一个关键字参数。如果对你的项目而言这是一个很重要的功能,那么你可能需要将各种情况都考虑进来,这个功能www.google.cn考虑的就很不错,页面编码本身是utf-8的,如果从搜索框搜索的,那么URL中是针对UTF8的关键字做的URL编码,如果是用户从地址栏输入,也就是针对GB2312的字符集做的URL编码,这里google在服务端应该是做了字符编码的判断,同样能够准确得到搜索结果,可用性不错,嘿嘿。

(PS:这里我自己也有一个疑问,目前没有找到直接的资料说明。对于包含非ASCII码的链接,IE会在背后做编码处理,只是没有像FF那样直接在地址栏反应出来,这点在HTTP通信中有资料说明。针对上面的demo,我尝试将“实验室”更换为其他字符测试,例如“你好”、“奥运”等,IE下并为出现demo中的怪异情况,这就说明PHP在接收GET过来的参数时,对于ASCII码以外的某些特殊字符并没有正确接收,问题是出在哪儿了?如果哪位知道原因希望告知。)

0
投稿

猜你喜欢

  • 新年钟声刚过,淘宝新版首页全“心”上线了,这次设计大胆的将布局从 960px 伸展至 1000px,页面更通透,新首页更大范围的实践了 HT
  • 1) 用正式表达式 regexp "[u0391-uFFE5]"2) 用length和char_lengthdrop t
  • 这最近在PJ的function库里看到的这个函数,感觉思路差了点,不过相对比较完美,只是闭合标签时的顺序问题,呵呵 修改一下数组arrTag
  • 请问如何从ASP连接到Oracle Server?可用下面的代码进行连接:   <%@ Lan
  • 您是否记得关闭所有的XHTML元素,在HTML中一些元素没有必要被关闭。当下一个元素开始的时候,上一个元素就自动被关闭。XHTML中是不允许
  • [sql] --1.将每个老师的工资更新为原来的工资+奖金 --定义两个变量,用来存储ttid与reward declare @tid in
  • 最近做了wap站中的搜索结果页的改版,记录一下关于锚点链接的心得~关于锚点链接锚点链接一般用于比较长的网页,使用内部链接建立页内目录。单击目
  • javascript版 俄罗斯方块(Russian box)小游戏,喜欢的朋友可以玩玩。对源代码感兴趣的朋友也可以研究一下。玩法介绍:可以输
  • 这几天研究UTF-8编码,太晕了,把我的看法和各位讨论讨论。欢迎来批啊。以下都是我的想法,哪里有不对的请不吝赐教,帮忙指出来。相关的题外话:
  • 1.获取function形参个数functionName.length2.较适用的运算符delete:删除以前定义的对象属性或方法的引用vo
  • 如今,互联网越来越走近我们的生活,网上冲浪也渐渐成为我们生活不可缺少的一部分。网络世界五彩缤纷,涌现出大量优秀精美的网页。大量网络信息的呈现
  • 在写完前面“模块化”相关的文章后,感觉试图用“模块化”本身去讲什么是“模块化”真是不容易讲得清。相信大家都多多少少能理解什么是“模块化”,但
  • 所谓“评论”不是必须得有文本框,用户录入提交数据才算,广义上的评论包括用户的任何“表态”,典型如打分。我接触电子商务时间并不长,最早应该是0
  •  URL 编码是什么东东呢?看看我从网上抄的定义:      引用: url编码是一种浏览器用来打包
  • ORA-00600:internal error code,arguments:[num],[?],[?],[?],[?] 产生原因:这种错
  • 下面的request.servervariables例子都是服务器探针采用的asp代码本机ip:<%=request.serverva
  • 很多网站现在都有使用QQ作为在线客服工具,我们点击它可以很方便的和网站人员联系,本站为你整理了在网站上使用QQ在线客服的代码,共13种风格,
  • 许多网站缺乏针对性和友好的导航设计,难以找到连接到相关网页的路径,也没有提供有助于让访客/用户找到所需信息的帮助,用户体验非常糟糕。本期薯片
  • Notepad++是一款不错的编辑器,很轻巧,我很喜欢它。再换个主题,加个代码高亮,看上去就更专业了。如果你是Mac用户,应该听说或使用过T
手机版 网络编程 asp之家 www.aspxhome.com