论文部分内容阅读
摘 要:从编码出发,分析了在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:
从程序中看出,存有“辽工大”三个字符的GB2312码的字节数组,使用IS08859-1解码后的Unicode字符串的字符并不是原来的三个字符的Unicode码,而是被解码成了六个字符,每个字符的低字节的内容都是原来字节数组中的数据,而高字节都是0。程序中打印的b4所对应的字符在内容中实际上是两个字节00b4。因此在解码时出现了一些除“?”以外的乱码。
3 解决的方法
对于程序1,由于当前系统默认的编码方式是GB2312码,将程序中的语句:
4 结束语
对于前面提到的字符编码的转换不仅存在于Java应用中,也存在于JSP和Servlet的应用中,有时还会出现这两个过程的叠加。甚至是两个过程的反复叠加,因此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:
从程序中看出,存有“辽工大”三个字符的GB2312码的字节数组,使用IS08859-1解码后的Unicode字符串的字符并不是原来的三个字符的Unicode码,而是被解码成了六个字符,每个字符的低字节的内容都是原来字节数组中的数据,而高字节都是0。程序中打印的b4所对应的字符在内容中实际上是两个字节00b4。因此在解码时出现了一些除“?”以外的乱码。
3 解决的方法
对于程序1,由于当前系统默认的编码方式是GB2312码,将程序中的语句:
4 结束语
对于前面提到的字符编码的转换不仅存在于Java应用中,也存在于JSP和Servlet的应用中,有时还会出现这两个过程的叠加。甚至是两个过程的反复叠加,因此Java应用中会产生一些与平台相关的问题,在程序的开发过程一定要引起注意。