public static void main(String[] args) {
String str = "中国";

System.out.println("系统默认编码:" + Charset.defaultCharset());

try {
//第一种情况
byte[] bytes1 = str.getBytes("GBK");
String newStr1 = new String(bytes1, "GBK");
System.out.println(newStr1);

//第二种情况
byte[] bytes2 = str.getBytes("UTF-8");
String newStr2 = new String(bytes2, "UTF-8");
System.out.println(newStr2);

} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}输出:都正常输出。字符编码不是很懂我感觉上面的两种情况应该有一种是乱码
JVM中的字符串都是Unicode编码,为什么得到GBK的字节数组和UTF-8的字节数组都可以重新正常输出呢?!
希望大家能解释一下这中间的原理啊。。

解决方案 »

  1.   

    无论你是gbk还是utf-8,经过编译生成的.class文件中,均是以unicode编码的方式存储。
    .getBytes("GBK"),按"GBK"的字符集返回某字符串在该编码下的byte数组表示,这时就和系统默认的UTF-8没有关系了。当只有没有指定用何种字符集时,会默认使用系统的字符集。
      

  2.   

    就是说用class文件中unicode编码的字符串可以用str.getBytes("GBK")来返回GBK编码下的字节数组?!我一直以为unicode编码的字符串只能用UTF-8/UTF-16等编码来实现呢。unicode编码转换成GBK编码下的字节数组,可是汉字字符在unicode和GBK下的二进制数值不同,返回GBK下的字节数组时是不是通过unicode和GBK码表之间的二进制数映射啊?(就是将该汉字字符在unicode下的二进制数值转换为该汉字字符在GBK下得二进制数值,然后在得到GBK下的字节数组)额,文字组织能力太差了