51testing周末精品班学员,关注自动化测试、性能测试,开源测试工具。欢迎大家与我交流。

JAVA字符编码问题

上一篇 / 下一篇  2013-02-21 16:56:09 / 个人分类:JAVA开发

    计算机中的字符都是用一个数字来表示的,用数字对字符进行编码。

    例如,美国的ASCII码,使用一个字节表示字符,一个字节能够表示的字符为256个,其实ASCII码只用了0-127表示128个字符。再比如中国大陆地区的GBK码,采用两个字节来表示中文字符,后来在GBK的基础上对更多的中文字符(包括繁体字)进行了编码,形成了GB2312,也就是说GBK是GB2312的子集。由于各个国家和地区之间使用不同的本地化字符编码,因此在相互的信息交换上很不方便,因此人们对全世界所有的符号进行了统一编码,称之为Unicode编码,这样不管在任何国家和地区,同一个字符就只有一个编码表示。

    在JAVA中使用的是Unicode编码,从而保证了跨平台跨国际特性,但是在显示输出和键盘输入上都是采用的本地编码。当JDK环境的设置的字符集与程序中设置的编码字符集在转换时如果出现不兼容,就会出现乱码的问题。也就是说JAVA中的乱码问题主要是JDK环境的编码设置有问题。要想解决乱码问题,就要修改JDK环境的编码设置,修改方法是下面的SetDemo方法。

    下面,举一个实际的例子来说明JAVA中字符的乱码问题。

    EncodingDemo在将字符串转换成byte数组的时候,用到了“GB2312”编码
import java.io.*;
public class EncodingDemo {
 public static void main(String[] args) throws Exception{
  byte[] b="大家一期来学习java语言".getBytes("GB2312");
  OutputStream ut=new FileOutputStream(new File("c:\\encoding.txt"));
  out.write(b);
  out.close();
 }
}
    设置JDK系统环境的字符集为GBK
public class SetDemo {
 public static void main(String[] args) {
  System.getProperties().put("file.encoding", "GBK");
  //查看JDK系统环境的字符集
  System.getProperties().list(System.out);
 }
}
先执行SetDemo,再执行EncodingDemo,发现c:\\encoding.txt中的内容为“大家一起来学习java语言”。这里没有出现乱码,主要是因为GB2312转换成GBK编码时没有出现不兼容的字符。


    现在我们将SetDemo和EncodingDemo作如下修改。
EncodingDemo在将字符串转换成byte数组的时候,用“ISO8859-1”编码
import java.io.*;
public class EncodingDemo {
 public static void main(String[] args) throws Exception{
  byte[] b="大家一期来学习java语言".getBytes("ISO8859-1");
  OutputStream ut=new FileOutputStream(new File("c:\\encoding.txt"));
  out.write(b);
  out.close();
 }
}
此时执行EncodingDemo,发现c:\\encoding.txt中的内容为“???????java??”

这是由于字符编码集ISO8859-1在转换成GBK编码时,出现了不兼容的编码,因此会出现乱码。


TAG:

 

评分:0

我来说两句

smile033

smile033

3年软件测试经验,熟悉java开发,Linux操作系统、Shell脚本、Mysql数据库,QTP。

日历

« 2024-03-27  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 18490
  • 日志数: 11
  • 建立时间: 2011-01-27
  • 更新时间: 2013-02-26

RSS订阅

Open Toolbar