APP下载

Java程序中乱码的由来及解决方法

2007-08-25王洪香

智能计算机与应用 2007年4期
关键词:数组字符解码

王洪香

摘要:从编码出发,分析了在Java中可能会产生编码问题的两个环节,并对不同情况给出了有效的解决方法。

关键词:Java汉字编码字符集

在Java语言的应用中,对字符的支持并非如同Java Soft的标准规范中所宣称的那样完美,尤其是中文字符集,所以在开发过程涉及到对汉字的处理时经常会出现乱码,给开发人员带来诸多不便。

1常见的字符编码

计算机中存储、处理和传送的数据是二进制的形式。各种文字、符号也必须用二进制数编码来表示,因此出现了一些不同形式的字符编码。

(1)IS08859-1码

IS08859-1码属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。由于是单字节编码,和计算机内表示单位一致,所以很多时候,仍旧使用IS08859-1编码来表示。而且在很多协议上,默认使用该编码。

(2)GB2312编码

GB2312编码是中华人民共和国国家标准汉字信息交换用编码,是由国家标准总局发布的关于简化汉字的编码,通行于中国大陆地区及新加坡,简称国标码。两个字节中,第一个字节(高字节)的值为区号值加32(20H),第二个字符(低字节)的值为位号值32(20H),用这两个值来表示一个汉字的编码。该字符集是一般中文操作系统默认的字符集。

(3)GBK编码

GBK编码是GB2312的扩展,是向上兼容的。它的编码范围是0x8140至0xfefe,其所有字符都可以一一映射至U-nicode2.0,实际上Java提供了对GBK字符集的支持。

(4)Unicode编码

Unicode编码是微软提出的解决多国字符问题的多字节等长16位编码,它对英文字符采取前面加“O”字节的策略实现等长兼容。如“A”字符的ASCII码为0x41,Unicode码为0x00,0x41。所以如果将高位字节去除,可以近似地将Uni-code转换为IS08859-1,它是Java内码的编码方式。

2 Java程序运行中出现的“?”和一些乱码的由来

(1)将字符的Unicode码转换成本地字符集码

下面的程序在将Unicode字符集转换成“IS08859-1”字符集时出现了“?”号。

程序1:

从上面程序中可以看出。由于Java中的字符采用是的Unicode编码,每个字符都占用两个字节,直接把每个字符中的内容对应着的整数打印出来,显示的结果就是这字符的Unicode码。String类中的getBytes方法,是将Unicode码的字符串中的每个字符数字,转换成该字符在指定的字符集下的数字,最后将这些数字存放到一个字节数组中返回。将一个字符的Unicode码转换成某种本地字符集码的过程叫编码。程序中的byte[]buf=strChina.getBytes(“is08859-1”)语句就是将Unicode码转换成了“IS08859-1”了。由于目标代码集中不存在对应代码,则得到的结果都是“3t”Hex值中的“3t”在Java中的用System.out.println(“u0031”)语句输出的结果就是“?”,这就是我们在Java程序中经常看到的“?”号的由来。

(2)将本地字符集码转换成Unicode码

在下面的程序中完成的是将键盘字节输入流中的每个字节读到一个字节数组中,然后将字节数组中的数据当作某种本地字符集码转换成Unicode码的字符串,此过程为解码。

程序2:

从程序中看出,存有“辽工大”三个字符的GB2312码的字节数组,使用IS08859-1解码后的Unicode字符串的字符并不是原来的三个字符的Unicode码,而是被解码成了六个字符,每个字符的低字节的内容都是原来字节数组中的数据,而高字节都是0。程序中打印的b4所对应的字符在内容中实际上是两个字节00b4。因此在解码时出现了一些除“?”以外的乱码。

3解决的方法

对于程序1,由于当前系统默认的编码方式是GB2312码,将程序中的语句:

4结束语

对于前面提到的字符编码的转换不仅存在于Java应用中,也存在于JSP和Servlet的应用中,有时还会出现这两个过程的叠加。甚至是两个过程的反复叠加,因此Java应用中会产生一些与平台相关的问题,在程序的开发过程一定要引起注意。

猜你喜欢

数组字符解码
JAVA稀疏矩阵算法
Python实现图片转字符画
解码 四十五度仰望天空
JAVA玩转数学之二维数组排序
文化解码
正则表达式快速入门
图片轻松变身ASCⅡ艺术画
文化 解码
文明 解码
更高效用好 Excel的数组公式