e有了更好的支持以后才逐步发展起来的。
通过web.xml设置解决URLEncoder.encode()方法和系统缺省编码方式相关的问题
据我所理解的范围内,JDK1.3中非常不符合JAVA的国际化规范的是在使用URLEncoder的时候:
比如在中文WIN98上运行的应用,使用URLEncoder.encode(String s)时:比如“中文”这2个字直接被Encoding的话结果是"%3F%3F"=>"??"。原因很简单,“中文”在encode()过程中需要先按GBK编码方式编码成4个BYTE后再URLEncoding才是正确的。这个在JDK1.4中也修正了。方法encode(String s)已经不鼓励使用,取而代之的是除了需要进行URLEncoding的字符串外,同时需要指定字符串编码方式的encode(String s, String enc)。这样,URLEncoder就可以和系统缺省的编码方式无关了。
在JDK1.3下,一个基于web-app框架的应用中,这个问题可以通过在WEB-INF/web.xml中设置来解决:
<web-app character-encoding="your_system_default_file.encoding">
</web-app>
如果产品是在中文WINDOWS98运行,缺省字符集是用GBK,则这个应用的web.xml需要设置成:
<web-app character-encoding="GBK">
</web-app>
Unicode inside Locale outsite
以上2个方法仍然只是让应用更方便地本地化了,而应用本身并不是真正的国际化应用。设想一下如何设计一个全球的论坛系统:可以让中文和日文的用户都可以方便的浏览发表呢?数据应该以那种字符集存储呢?
答案很简单:Unicode。最后,我以GOOGLE的国际语言搜索引擎做一个设计实例说明如何实现国际化应用的设计:GOOGLE是一个非常好的国际化应用榜样(但我可没说GOOGLE是java做的哟)。
GOOGLE用户经常有这样的感觉:
为什么我第一次去GOOGLE,出现的就是中文的界面?
为什么在所有网站中查中文:有时候还会出日文网站的结果?比如:"google 秘密"
就以"google 秘密"这个
查询为例:我们在输入框输入"google 秘密"
http://www.google.com/search?hl=zh-CN&newwindow=1&q=google+%C3%D8%C3%DC&btnG=Google%CB%D1%CB%F7&lr=
简单的流程说明如下:
输入:查询(按客户端编码方式)=>GOOLGE(将输入的字节流解码成UNICODE)=>查询UNICODE索引=>UNICODE结果集=>输出:
查询结果(按客户端编码方式编码成字节流)
具体说明:
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中映射的字一样,就可以查询到相应的日文网