扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
HTTP GET编码
URL链接中带有多字节字符会使事情复杂化,这种情况很常见,例如在链接里加入用户名或其它信息以便传给下一页。
但RFC (因特网标准草案) 2396中并未明确规定URL中有非US-ASCII字符时的格式,不同的浏览器会采用它们自己的方式来编码URL中的多字节字符。
以Mozila为例(如图7/8/9/10),通常是在HTTP请求发送前对URL编码。我们知道在URL编码过程中,首先根据某种编码方式(如UTF-8或GBK)将一个多字节字符转换成两个或更多的字节,然后每个字节用3个字符组成的字符串%xy来表示,其中xy是表示该字节的两个十六进制数。这方面的更多信息可参考HTML规范。不管怎样,URL编码所采用的编码方式取决于当前页面的编码方式。
我用下面这个gbk_test.jsp页面做演示:
清单3
x738b是一个中文字符的转义值,这个中文字符就是我的姓。该页面如图7所示。
当鼠标移动到该链接上时,链接的地址就会在状态栏中显示出来,可以看到URL中嵌入了一个中文字符。点击页面中的链接,可以从地址栏中清楚地看到该字符已被URL编码。字符x738b被编码为%CD%F5,这是URL编码与GBK编码共同作用的结果。
在服务器端,用request.getQueryString()方法取出查询字符串;为与查询字符串相比较,接下来的一行用另一种方法getParameter(String)来显示字符,如图8所示。
把当前页面的编码方式由GBK改为UTF-8,再次点击页面中的链接,出现的结果为:x738b被编码为%E7%8E%8B,如图9所示,这是URL编码与UTF-8共同作用的结果。
Microsoft的IE浏览器却以不同的方式处理多字节的URL编码。IE在HTTP请求发送前不对URL编码,URL编码方式取决于当前页面的编码方式,如图10所示。
IE还有一个高级选项设置,可以强制浏览器总是以UTF-8编码方式发送URL请求,如图11所示。
根据以上说明我们会面临一个问题:如果应用页面的URL链接中带有多字节字符,只要用GBK编码就能在Mozilla里正常使用;但如果用户的客户端是IE,且在设置中强制浏览器以UTF-8编码发送URL请求,那么在使用中就会遇到问题。 |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者