的论坛系统:可以让中文和日文的用户都可以方便的浏览发表呢?数据应该以那种字符集存储呢?答案很简单: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中映射的字一样,就可以查询到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UNICODE的,最后将UNICODE结果按照客户端的编码方式转换成字节流,返回到客户端。
从以上的分析中我们可以看出:UNICODE实际非常漂亮的解决了应用的国际化问题
1 数据按可以转换成任意字符集的UNICODE方式集中存储(Unicode inside)
2 然后根据客户端的本地化设置转换成本地字符集 (Locale outside)
如果在此之前的应用的汉化设计相当于UCDOS和RichWin的话,这种方式迟早要被内核汉化的WIN95淘汰的。毕竟核心级别对国际化的支持才是一个真正的简化应用设计的通用解决方案。Microsoft和Sun的很多产品从一开始就是为世界市场设计的,“汉化”思路的根源在于我们的软件开发中满足于自给自足的小农意识。
参考文档:
Java的国际化设计
http://java.sun.com/docs/books/tutorial/i18n/index.html
Linux 国际化本地化和中文化
http://www.linuxforum.net/doc/i18n-new.html
Linux 程序员必读:中文化与GB18030标准
http://www.ccidnet.com/tech/os/2001/07/31/58_2811.html
Unicode FAQ
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://www.linuxforum.net/books/UTF-8-Unicode.html (中文版)
Java 编程技术中汉字问题的分析及解决
http://www-900.ibm.com/developerWorks/java/java_chinese/index.shtml
汉字的编码方式:
http://www.unihan.com.cn/cjk/ana17.htm
*注释:l10n i18n都是缩写:用的是英文单词的首位字母和其间字母个数
l10n: localization 本地化
i18n: internationalization 国际化
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中映射的字一样,就可以查询到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UNICODE的,最后将UNICODE结果按照客户端的编码方式转换成字节流,返回到客户端。
从以上的分析中我们可以看出:UNICODE实际非常漂亮的解决了应用的国际化问题
1 数据按可以转换成任意字符集的UNICODE方式集中存储(Unicode inside)
2 然后根据客户端的本地化设置转换成本地字符集 (Locale outside)
如果在此之前的应用的汉化设计相当于UCDOS和RichWin的话,这种方式迟早要被内核汉化的WIN95淘汰的。毕竟核心级别对国际化的支持才是一个真正的简化应用设计的通用解决方案。Microsoft和Sun的很多产品从一开始就是为世界市场设计的,“汉化”思路的根源在于我们的软件开发中满足于自给自足的小农意识。
参考文档:
Java的国际化设计
http://java.sun.com/docs/books/tutorial/i18n/index.html
Linux 国际化本地化和中文化
http://www.linuxforum.net/doc/i18n-new.html
Linux 程序员必读:中文化与GB18030标准
http://www.ccidnet.com/tech/os/2001/07/31/58_2811.html
Unicode FAQ
http://www.cl.cam.ac.uk/~mgk25/unicode.html
http://www.linuxforum.net/books/UTF-8-Unicode.html (中文版)
Java 编程技术中汉字问题的分析及解决
http://www-900.ibm.com/developerWorks/java/java_chinese/index.shtml
汉字的编码方式:
http://www.unihan.com.cn/cjk/ana17.htm
*注释:l10n i18n都是缩写:用的是英文单词的首位字母和其间字母个数
l10n: localization 本地化
i18n: internationalization 国际化
| 对此文章发表了评论 |
