多谢 ^^
按这个解说查找相关资料,知道了不少东西——
Google 以前的解码方式是:
Quote:
设想一下如何设计一个全球的论坛系统:可以让中文和日文的用户都可以方便的浏览发表呢?在数据中间处理阶段应 该以那种字符集存储呢?答案很简单:UniCode。以前很多文章都有关于如何设计一个国际化界面的介绍,只是应用的本地化界面输出,但很少提及数据在中间处理过程中如何适应国际化。
输入和存储阶段就用UniCode方式进行处理和存储,以方便应用以后的国际化。GOOGLE的设计就是一个非常好的国际化应用榜样,我以GOOGLE搜索引擎的国际化支持为例说明如何实现国际化应用 的设计。
GOOGLE用户经常有这样的感觉:
首先我将GOOGLE对查询的处理流程简单的说明如下:
[*]客户端浏览器输入;[*]查询字符串按客户端系统编码方式(GBK)转换成字节流,并URL Encode后传给GOOGLE;
[*]GOOLGE将输入的字符串URL Decode后,按照客户端的系统编码方式将这个字符串(字节串)解码成UniCode
[*]查询过程,完全是基于UniCode的匹配过程,比如对于“中文”这2个字在简体繁体中文和日文里都有,因此无论是何种语言的页面包含这2个字的页面都能匹配上。
[*]结果集输出:将查询结果集的内容(UNICODE)按客户端系统编码方式(GBK)“编码”成的字节流,返回给浏览器
具体说明:
GOOGLE如何识别出浏览器使用的“界面语言”:GOOGLE获得这个查询字符串的同时,一般会根据hl=zh-CN这个参数,知道了客户端使用的字符集编码方式,如果用户第一次访问:GOOGLE会根据 浏览器的发送的请求中包含的Accept language: zh_cn这个头信息来判别,这就是为什么现在很多用户第一次去GOOGLE的时候它就能自动识别出来的原因。这个参数在之后的查询和翻页过程中通 过cookie保存,并通过get方式一直传递给GOOGLE(因此你也可以使用使用偏好设置界面语言),从而可靠地识别出客户端的编码方式。
GOOGLE如何查询:也许从URL上你可以看到:传过去的“秘密”这个查询实际上是%C3%D8%C3%DC=>"秘密"这2个字按GBK(WINDOWS客户端缺省的编码方式)编码方式的4个字节然后再URLEncode 后的形式(关于中文编码方式请参考:汉字的编码方式),GOOGLE将查询字符串按这个编码方式解码并转成UniCode,然后用这个UniCode编码方式的字符串进行内部的查询操作。而任何语言 的页面都是先转换成UniCode后存储在GOOGLE的数据索引库里的。在UniCode中日文和中文写法一样的字,用的是同样的编码。因此,如果你没有指定语言过滤的话,日文网页的结果就首先被命 中了;因此,对于中文客户端的查询:如果相应字符在UniCode中和繁体,日文映射的字一样,就可以匹配到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UniCode的,最后将 UniCode结果按照客户端的编码方式转换成字节流,返回到客户端。
从以上的分析中我们可以看出:UniCode非常漂亮的解决了应用的国际化问题。对于应用前端来说,剩下的工作就是根据本地编码环境进行本地化的过程了。
数据从输入的开始,就全部先转换成UniCode,然后再进行处理,并按照UniCode方式集中存储(UniCode inside)
数据输出过程中,只是在最后输出到客户端的时候,按照客户端的本地化设置将UniCode数据转换成本地字符集,并配以相应语言/字符的界面(Localization outside)
如果应用的开发只是满足于在国内市场自给自足,“汉化”的思路的大量出现是很自然的。但要是把“汉化”比作UCDOS和RichWin的话,那么这种汉化方式迟早要被内核汉化的WIN95淘汰的。毕竟核心级别对 国际化的支持才是一个真正简化前端应用设计、通用的解决方案。Microsoft和Sun等国际化大公司的产品从一开始就是为全球市场设计的,因此对国际化的支持一致非常重视。相比之下国内软件行业对相 应国际标准显然重视不足,也很少积极地参与相关标准制定。
source: http://www.chedong.com/tech/unicode_java.html#google
升级后的解码方式是:
Quote:
GOOGLE的国际化做得很好。我们知道,你在www.google.com 里面输入一个检索词,然后便会生成一个HTTP的GET请求。这个请求一般有几个参数,以前的http://www.google.com/search?q=%s就是最简单的一个,%s就是用来代替你输入的值的。但GOOGLE是一个面对全球服务的站点。它收到请求后会解释q的值。如果大家写过JSP或者JAVA程序,就会经 常陪到getParameter得到的中文是乱码。这里面就是一个编码问题。浏览器的地址栏内的URL,一切非正常字符(A- z,0-9,:,.等)都会进行编码(Encode,一个%号,然后加上它的ASCII内码,一个中文一般会编码成为两个,如“中 文”两个字会编码为:%D6%D0%CE%C4)然后程序收到请求后会进行相应的解码。
GOOGLE近期改进了它的编码方案,即是在生成URL的时候,由客户端按照指定的编码进行Encode,查看 www.google.com主页的源文件,你会发觉encodeURIComponent这个Javascript的函数。默认情况下,会用Javascript的 功能,把输入的检索词进行UTF-8编码,“中文”两个字就会编码成:%E4%B8%AD%E6%96%87,一个六个字节。这时如果 还是按照四个字节进行解码,就会出错,也就是乱码。可以对比默认情况下的编码,是四个字节。具体关于字符编码的 内容,就不在这里讨论。
再来看Google配置检索式的时候的几个参数:
[*]ACTION地址: http://www.google.com/search?
[*]q 检索的词,即你在输入框内输入的内容,会进行URL Encode编码
[*]lr 检索范围。如“lr=”表示检索所有的网站,lr=lang_zh-CN表示检索中文简体,lr=lang_zh-CN|lang_zh-TW表示 中文网页(简繁)
[*]ie 指示浏览器URL的编码,Google会将q的值按照这个编码来进行解码(这个最重要)
[*]oe Outlook的编码??(这个参数暂不清楚什么意思,目前对检索没有影响,直接给一个值,或者不要也行
这时就可以按需进行组合了,名和值之前为“=”,每个之间以“&”进行连接
如:http://www.google.com/search?q=%s&ie=GB2312&lr=lang_zh-CN[/url]|lang_zh-TW
意思为:浏览器的URL编码为GB2312,检索范围为“中文网页”
http://www.google.com/search?q=%s&ie=UTF-8&lr=lang_zh-CN
意思为:浏览器的URL编码为UTF-8,检索范围为“简体中文网页”
如果是检索图像,把search换成images就行了,其它不变。
http://images.google.com/images?q=%s&ie=UTF-8&lr=lang_zh-CN
source: http://goto.biz01.net/readnews.asp?newsid=215
顺便也搞明白置顶贴“Google中文搜索成功升级!MyIE2须作改动”的原理是什么了
这篇文章挺好看,荐一下:
从汉化到国际化——UniCode inside, Localization outsite