世界上的各地区都有本地的语言。地区差异直接导致了语言环境的差异。在开发一个国际化程序的过程中,处理语言问题就显得很重要了。
这是一个世界范围内都存在的问题,所以,java提供了世界性的解决方法。本文描述的方法是用于处理中文的,但是,推而广之,对于处理世界上其它国家和地区的语言同样适用。
汉字是双字节的。所谓双字节是指一个双字要占用两个byte的位置(即16位),分别称为高位和低位。中国规定的汉字编码为gb2312,这是强制性的,目前几乎所有的能处理中文的应用程序都支持gb2312。gb2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。
另外有一种编码,叫做gbk,但这是一份规范,不是强制的。gbk提供了20902个汉字,它兼容gb2312,编码范围为0x8140到0xfefe。gbk中的所有字符都可以一一映射到unicode 2.0。
在不久的将来,中国会颁布另一种标准:gb18030-2000(gbk2k)。它收录了藏、蒙等少数民族的字型,从根本上解决了字位不足的问题。注意:它不再是定长的。其二字节部份与gbk兼容,四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到0x39。
本文不打算介绍unicode,有兴趣的可以浏览“http://www.unicode.org/”查看更多的信息。unicode有一个特性:它包括了世界上所有的字符字形。所以,各个地区的语言都可以建立与unicode的映射关系,而java正是利用了这一点以达到异种语言之间的转换。
在jdk中,与中文相关的编码有:
表1 jdk中与中文相关的编码列表
| 编码名称 | 说明 |
| ascii | 7位,与ascii7相同 |
| iso8859-1 | 8-位,与 8859_1,iso-8859-1,iso_8859-1,latin1...等相同 |
| gb2312-80 | 16位,与gb2312,gb2312-1980,euc_cn,euccn,1381,cp1381, 1383, cp1383, iso2022cn,iso2022cn_gb...等相同 |
| gbk | 与ms936相同,注意:区分大小写 |
| utf8 | 与utf-8相同 |
| gb18030 | 与cp1392、1392相同,目前支持的jdk很少 |
在实际编程时,接触得比较多的是gb2312(gbk)和iso8859-1。
为什么会有“?”号
上文说过,异种语言之间的转换是通过unicode来完成的。假设有两种不同的语言a和b,转换的步骤为:先把a转化为unicode,再把unicode转化为b。
举例说明。有gb2312中有一个汉字“李”,其编码为“c0ee”,欲转化为iso8859-1编码。步骤为:先把“李”字转化为unicode,得到“674e”,再把“674e”转化为iso8859-1字符。当然,这个映射不会成功,因为iso8859-1中根本就没有与“674e”对应的字符。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器