首页 > 网络技术 > 浅谈不同浏览器地址栏中编码的差异

浅谈不同浏览器地址栏中编码的差异

2010年5月31日 Terence 346 次阅读 发表评论 阅读评论

  今天是上交学院专业论文的最后一天,总算拼死拼活把它赶了出来……作为比赛论文,档次当然没毕业论文那么高啦 ;-) ,权当是娱乐而已,拿不拿奖就是另外一回事了。貌似这篇论文跟我的专业没什么必然的联系,倒是他们网工专业的刚好适合,但不知为什么写这类型的我就特别顺手。。。

摘要:

  本文介绍了中文版本的IE、Firefox、Opera这三种主流的网页浏览器在基于中文Windows操作系统下的地址栏中为了表示URL里的中文字符所采用的编码的差异,并且对各种可能情况进行适当地讨论,同时对所带来的各种实际问题做出解决方案。

关键词:

  浏览器,汉字编码,URL,网站开发,搜索引擎

Abstract:

  In this article, introduces the Chinese version of the Opera, IE, Firefox 3 kinds of mainstream web browser Windows operating system based on Chinese in the address bar to the URL in using Chinese characters, and the difference of coding possible situation, appropriately discussed the problems caused by making solutions.

Key words:

  Internet browser, Chinese character encoding, URL, Web development, Search engines


1.引言

  我们使用网页浏览器打开搜索引擎,搜索中文关键字的时候有否注意过在地址栏中有类似于“%E4%B8%AD%E5%9B%BD”这样的奇怪的字符串呢?而在搜索英文关键字时,地址栏中却就可以正常显示出真正要在查找的关键词?我们所要探讨的问题就是为什么地址栏中不直接显示中文而是一堆看似杂乱无章的“乱码”。

2.地址传输原理

  关于URL地址的传输,我们还得先从HTTP协议入手。首先,浏览器与网络服务器建立TCP连接,连接建立后,向网络服务器发出访问请求。HTTP 定义了浏览器与网络服务器交互的不同方法,最基本的方法是 GET 和 POST,根据协议,这两种方式中都包含了客户端的IP地址、浏览器类型和请求的URL。当然,两者之间还是有比较明显的区别:

  (1)在浏览器,GET方式是通过URL提交数据,数据在URL中是可见的;而POST方式,数据是放置在HTML的Header内提交的。

  (2)GET方式提交的数据最多只能有4096字节(以IE6为例),而POST就没有此限制。

  (3)安全性问题。正如在(1)中提到的,使用GET的时候,参数会显示在地址栏中,而POST不会。所以如果传输的数据是非敏感数据,那么可以使用GET;如果请求的数据包含敏感内容,那么还是使用POST为好。

3.搜索引擎的请求响应

  对于一般普遍的搜索引擎,其发送的请求是用的是GET方式。在中文IE浏览器中打开Google,搜索关键词“我”,结果页面打开后,地址栏中显示的是“http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E6%88%91”,我们再来看下在Firefox浏览器中的表现,输入同样的关键字,地址栏中显示的是“http://www.google.com.hk/search?hl=zh-CN&source=hp&q=我”,个别情况下显示的是“http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%CE%D2”,而在Opera中,其表现得与IE类似。当然,那些百分号加数字很明显代表的就是汉字的编码,目前我们比较常用的是GBK和UTF-8编码字符集。以上都是通过GET请求,参数用中文字符串的例子。

  问题由此引出,为什么不同的浏览器会有不同的中文表示方法?

4.汉字在电脑上的编码

  首先我们要了解下汉字的编码。众所周知,电脑中的每个字符归根结底都是由1和0组成,而电脑是由美国最先研制出来的,所以字符只局限于26个英文字母和若干种符号,每个字符都有对应的ASCII码,如果想要在电脑上表示一个中文字符,就必须先经过编码。任何编码都需要一个共同约定的规范,我们的前辈在汉字编码上所做出的成就是伟大的。以下是现今较为流行的汉字编码方式:

  GBK:GBK编码是GB2312的升级版,GB2312是“中华人民共和国国家汉字信息交换用编码”,由国家标准总局发布,1981年5月1日起实施,通行于大陆,新加坡等地也使用此编码。GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312将代码表分为94个区,对应第一字节;每个区94个位,对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区,10-15区、88-94区是有待进一步标准化的空白区。GB2312最多能表示6763个汉字。但随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,只能编码6763个汉字就显得捉襟见肘了。所以了为了解决这些问题,以及配合UNICODE的实施,全国信息技术化技术委员会于1995年12 月1日发布GBK。GBK向下与GB2312 完全兼容,向上支持ISO 10646国际标准,起到了承上启下的作用。GBK 亦采用双字节表示,总体编码范围为8140-FEFE之间,共收录21886个汉字和图形符号,简繁体字融于同一库。

  UTF-8:UTF-8编码是用以解决国际上字符的一种多字节编码,它对英文使用一个字节,中文使用三个字节来编码。UTF-8包含全世界所有国家需要用到的字符,是国际编码,通用性强。UTF-8编码的文字可以在各国支持UTF8字符集的浏览器上显示。如果是UTF8编码,则在外国人的英文浏览器上也能显示中文,而无需下载相应的中文语言支持包。

  下表以汉字“中国”为例,用不同的编码在实际计算机中存储的差异:

汉字 

编码 

二进制表示 

中国

UTF-8

0xe4 0xb8 0xad 0xe5 0x9b 0xbd

中国

GBK

0xd6 0xd0 0xb9 0xfa


5.浏览器与服务器间的编码通讯

  不管对于任何一款浏览器来说,一个HTTP请求都得经过的以下三个环节:

    浏览器(GET/POST) → 网络服务器 → 浏览器显示

  (1)浏览器把URL经过编码后发送给WEB服务器。

  (2)WEB服务器把这些内容解码转换为UNICODE,处理完毕后,再把结果(即网页)编码返回给浏览器。

  (3)浏览器按照指定的编码显示该网页。

  鉴于中文编码的非唯一性,对于第(1)环节,我们可以用一个实验来证明之:在IE浏览器中打开Google,可以发现Google的编码是UTF-8,将网页编码强制修改为GB2312,此时,页面上的中文会变成乱码,不理它,在文本框中输入“我”然后提交,地址栏中会将其编码为“%CE%D2”而不是在上面提到的正常情况下所表示的“%E6%88%91”。由此可见,浏览器在发往服务器前,对参数内容进行URL编码使用的就是浏览器编码 。

  同时,以上的实验说明了不同的浏览器在各种情况下对汉字的编码有着不同的处理方法。

  URL地址中有PathInfo和QueryString两种变量,其中QueryString又叫参数。比如“http://localhost/example/中国?name=中国”,其中第一个“中国”是PathInfo,第二个就是QueryString。地址通过GET方式提交,浏览器会对URL进行URL Encode,不同的浏览器对于PathInfo和QueryString的支持各不一样。通过实验和查找了相关资料,现将结果整理如下:

  (1)对于IE,如果在“选项——高级”选项中选中“总以UTF-8发送(默认方式)”,则PathInfo的是按照UTF-8编码,QueryString是按照GBK编码的,其中QueryString不进行URL encode。

  在浏览器中输入:

  http://localhost/example/中国?name=中国

  实际的提交是:

  GET /example/%E4%B8%AD%E5%9B%BD?name=%D6%D0%B9%FA

  (2)对于IE,如果取消“总以UTF-8发送”,则PathInfo和QueryString都按照GBK编码,同时两者都不进行URL encode。

  实际的提交是:

  GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA

  (3)对于Firefox,默认方式下PathInfo和QueryString都按照UTF-8编码。

  实际的提交是:

  GET /example/%E4%B8%AD%E5%9B%BD?name=%E4%B8%AD%E5%9B%BD

  (4)对于Firefox,在其地址栏中输入“about:config”,找到选项“network.standard-url.encode-utf8”,设置为“False”,即可改变发送PathInfo和QueryString的编码方式为GBK。

  实际的提交是:

  GET /example/%D6%D0%B9%FA?name=%D6%D0%B9%FA

  需要说明的是在这两种情况下,Firefox有时会“自作聪明”一点,如果参数里有它认识的URL encode后的字符串时,它就会自动恢复成原始中文显示,以增加URL友好显示程度。

  (5)对于Opera,则PathInfo和QueryString都按照UTF-8编码。

  实际的提交是:

  GET /example/%E4%B8%AD%E5%9B%BD?name=%E4%B8%AD%E5%9B%BD

6.结论

  需要说明的是,以上实验都是在中文Windows系统、中文版的浏览器下测试通过的。很显然,不同的浏览器甚至同一浏览器的不同设置,都会影响最终发送的URL编码。所以为了不必要的麻烦,开发网站过程中,URL尽量不要使用中文,如果写入网页中的链接包括中文字符,最好使用URL encode处理,才能和当前网页编码无关,否则可能会造成不能正确访问。

7.解决方案

  但事情不是那么绝对的,测试过百度搜索引擎,不管在IE中开不开启“总以UTF-8发送”,URL中的中文编码总是保持GB2312编码不变,这就不得不说到“动态识别字符编码”技术,它通过网页中添加“<meta http-equiv=content-type content="text/html; charset=gb2312">”这样的约定标记或者进行编码规律识别来使中文总以指定的编码来打开页面。

  鉴于不同浏览器之间编码时采用的字符集不同,在开发网站时,本文给出如下建议:

  (1)不同的WEB服务器端对各种编码的URL处理也不相同,所以尽量不要使用中文字符作文件名。

  (2)很多情况下浏览器的地址栏看到URL并不等同于发送到WEB服务器的URL,要正确查看浏览器发送的到服务器URL,最好借助一些工具分析HTTP的请求头。

  (3)一定要考虑到不同环境下URL编码的不同,才能实现系统更好的兼容性,兼容性好的系统必须要能够识别来自客户端URL的编码,才能正确地处理地址。

  (4)建议URL中的URL encode编码的字符集和网页的Content Type的字符集采用相同的字符集,这样程序的实现就变得很简单,不需要做复杂的编码转换了。

参考文献:

  [1] (日)小泉. WEB技术——HTTP到服务器端. 科学出版社

  [2] 宫垂刚,韦一,张华丰等. PHP完全自学手册. 机械工业出版社

  [3] wangjun_1218. 浏览器URL编码.  http://blog.csdn.net/wangjun_1218/archive/2009/07/08/4330244.aspx

  [4] guobin. 不可能的任务:地址栏用中文参数. http://blog.sina.com.cn/s/blog_3f63cc9d0100a92y.html





分类: 网络技术 标签: , , ,
  1. nbjsw
    2010年6月2日03:11 | #1
    Firefox 3.6.3 Firefox 3.6.3 Windows Vista Windows Vista

    你的高中英语老师看了你的那段Abstract会哭的

    [回复]

    Terence

    2010年6月2日11:49
    Internet Explorer 8.0 Internet Explorer 8.0 Windows XP Windows XP

    @nbjsw, 嘿嘿,懒得去翻译了,时间有点紧,用海词算了 :mrgreen:

    [回复]