String str = new String("中".getBytes(),"gb2312");
String temp = new String(str.getBytes(),"utf-8");
String an = new String(temp.getBytes(),"gb2312");
System.out.println(an);
这里为什么输出的an会是乱码么????请哪位大侠帮忙解释下。。谢谢

解决方案 »

  1.   

    第一个str可能会出现乱码,这个和Default Encoding有关系,如果当前的编码是gb2312,那么str就是中,如果本地编码不是gb2312,将有可能出现乱码,至少肯定不是‘中’这个字符。
    因此,我们在对字符串进行解码的时候,尽量指定编码方式。
    好,现在我现在假定本地编码是gb2312,这个时候temp肯定是乱码。一个使用gb2312解码字节数组,用utf8编码的话,肯定是不能解析成正确的字符串的。
    如果,temp是乱码,也就是出现几个?,使用本地编码进行解码的时候,是能够被正常解码的,因为本地编码和gb2312对?号的编码的字节一致,因此编码后的an依然是?
      

  2.   

    输出第一行中的str应该也会出现乱码,java使用的是UTF16编码表示字符。
      

  3.   

    同样的二进制码在不同的编码形式下对应的结果不同!"中".getBytes()获取的byte数组在utf-8下就被理解成了其他的字符串,不再是"中"了。
      

  4.   

    new String("测试文件".getBytes("GB2312"), "8859_1"))
    这样 测试下 
      

  5.   

    这里改成就不乱码了:
                   String str = new String("中".getBytes("gb2312"),"gb2312");
    String temp = new String(str.getBytes(),"utf-8");
    String an = new String(temp.getBytes());
    System.out.println(an); 
      

  6.   

    这位兄弟讲的很好,其实问这个问题的时候,我也看了一些关于中文乱码问题的资料。其中一点比较难以理解的。假设我们当前的系统默认编码是gb2312,那么当我们不去设置编码的时候,我们的输入的字符串会是从gb2312转化成unicode在虚拟机中运行,然后把输出字符串由unicode转化为gb2312(本地编码)在显示接口上,所以我就想当然认为gb2312->unicode->gb2312能够正常的显示中文,看来这种想法是错的。。那么虚拟机又是怎么做到这种正确的转化的么?也就是说把"中"的gb2312码转换为虚拟机中unicode码,然后再转换为gb2312码,还能正确的显示中文字么?
      

  7.   

    String的getBytes()方法是有一个默认编码的,可以用
    String str = new String("中".getBytes("gb2312"),"gb2312");
    System.out.println(str); 
    试试,看是否还是乱码
      

  8.   

    String str = new String("中".getBytes("GB2312"),"gb2312"); 
    String temp = new String(str.getBytes("utf-8"),"utf-8"); 
    String an = new String(temp.getBytes("ISO-8859-1"),"gb2312"); 
    System.out.println(an); 
    挨个试试吧。getBytes()里要放需要转换的字符串的编码格式
      

  9.   

    首先要清楚
    1:/ java 中将字节数组按照一定的编码规则生成字符的过程称为编码
    2:/ 将字符按照一定的编码规则生成字节数组的过程成为解码
    3:/ 编码规则--关于这点应该有很多话要说。但要解决这个问题只要知道:它规定了一个字节数组与一个特定的字符相对应
    4:/ java 采用的字符时 UNICODE 字符。关于这个也是跟很长的话题。解决这个问题只要知道:UNCODE 包括的目前世界上的所有文字符号。(有可能不是全部呵呵~~没有考证啊~)
    String str = new String(/*flag-1*/"中".getBytes()/*这里的含义是:将"中"这个字符以默认的编码方式解码(默认的解码方式与系统有关。简体中文的 WindowXP 好像是 GBK 其余 gb2312 有一定的兼容性)生成字节数组*/
    ,"gb2312"); // 将 flag-1 处的操作所生成的字节数组按 gb2312 编码. 解码与编码方式一致没有乱码问题。
    String temp = new String(str.getBytes(),/*这里的含义是:将"中"这个字符以默认的编码方式解码. 注意这里用到的编码方式是 GBK. GBK 规定 [-42, -48] 这个字节数组与 "中"相对应。*/
    "utf-8"); // 这里使用 utf-8 将 [-42, -48] 进行编码。但是 utf-8 规定 [-28, -72, -83] 这个字节数组与 "中" 字相对应。--所以到这里已经乱码了。
    String an = new String(temp.getBytes(),"gb2312"); //这里不知道 LZ 是不是希望实现将乱码在转会正常字符。这不可能。应为 temp.getBytes() 不能再次生成  [-42, -48] 这个字节数组
    System.out.println(an); 
      

  10.   


    其实,在JAVA中使用字符串的时候,是根本不需要考虑编码的问题,只有涉及到字符串到字节数组转换的时候,比如存储到文本中,或从文本中读取,我们才需要考虑编码的问题,对于同一字符串,用不同的编码进行编码,得到的字节数组是不一致的.至于虚拟机怎么处理的,跟我们使用String是没有关系的.
    在Java中,一个字符始终是以两个字节存储,在转换为字节码的时候,每个字符在字节码里面占用两个字节.
    假设你当前编码是GB2312,当执行到需要显示字符串的时候,虚拟机做了这么些事情.第一步,拿到字节码中存储的字节数组;第二步,使用UNICODE编码把字节数组解码成对应的字符串,第三步,显示字符串.