String str = "中华人民共和国";
String str1 = new String(str.getBytes("utf-8"),"gbk");
System.out.println("str=="+str);
System.out.println("str1=="+str1);
String str2 = new String(str1.getBytes("gbk"),"utf-8");
System.out.println("str2=="+str2);----------------------------------------------
str==中华人民共和国
str1==涓崕浜烘皯鍏卞拰鍥?
str2==中华人民共和??如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?

解决方案 »

  1.   

    建议不要把编码转来转去,这样最后肯定是混乱。
    简单就是美。String str = "中华人民共和国"; 
    这是双字节unicode编码。
    str.getBytes("utf-8")
    unicode转为utf-8
    new String(str.getBytes("utf-8"),"gbk"); 
    utf-8转为gbk
    好像没什么意义。
      

  2.   

    utf-8和gbk这两种编码格式都支持汉字,不知道LZ这么转有什么意义。
    转码因为编码方式的不同,并不是说像LZ这样转过去然后在转回来就能得到正确的结果的.
    由于编码方式的不同,在转码过程中可能有一些信息已经丢失.
      

  3.   

                    String str = "中华人民共和国"; 
    String str1 = new String((str+"@").getBytes("utf-8"),"gbk"); 
    System.out.println("str=="+str); 
    System.out.println("str1=="+str1); 
    String str2 = new String((str1).getBytes("gbk"),"utf-8"); 
    System.out.println("str2=="+str2.substring(0,str2.length()-1));
      

  4.   

    用ISO-8859-1 取转成需要的 
      

  5.   

    不是所有的编码都可以随便转换的
    String都可以用UTF-8变成byte
    byte都可以用ISO-8859-1变成String
    new String("STR".getBytes("UTF-8"),"UTF-8")
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1")
    是没问题的
      

  6.   

    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?
    不一定的
    byte[] 到 string 用GBK的转换方式是
    0-128 的byte 转换成一个unicode字符
    128-256的byte加上后面的一个字节 转换成一个unicode字符
      

  7.   


    byte[] a = str.getBytes("gbk");
    然后我把a进行传递,传到后,
    用String strnew= new String(str,"gbk");
    现在就没乱码了。
    我的问题是传递一个String的参数,接收后变成乱码了,乱码和这个转换一样new String(str.getBytes("utf-8"),"gbk"); 
    所以前面我才想到再给转回来,不想转回来有问题,不知道大家看懂没,
      

  8.   


    照你这么说new String("STR".getBytes("UTF-8"),"UTF-8")  
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1")  
    没问题,
    new String("STR".getBytes("gbk"),"gbk") 有问题了?
      

  9.   

    引用 8 楼 hendy 的回复:
    如果str是单数的汉字的话,最后转回来不能转全,如果str是双数的汉字的话就可以转全,有什么解决的办法吗?  
    不一定的  
    byte[] 到 string 用GBK的转换方式是  
    0-128 的byte 转换成一个unicode字符  
    128-256的byte加上后面的一个字节 转换成一个unicode字符  
     照你这么说new String("STR".getBytes("UTF-8"),"UTF-8")   
    (new String(byte[],"ISO-8859-1")).getBytes("ISO-8859-1")   
    没问题, 
    new String("STR".getBytes("gbk"),"gbk") 有问题了?
    如果 "STR"不是GBK编码,是其它的字符集,就可能有问题,因为GBK并没有覆盖整个UNICODE 16字符集
      

  10.   

    UTF-8 以三个字节来表示汉字,GBK 以两个字节来表示汉字。中华人民共和国的 UTF-8 编码如下:E4B8AD E58D8E E4BABA E6B091 E585B1 E5928C E59BBD将这些再组成两个字节的 GBK 编码:E4B8 ADE5 8D8E E4BA BAE6 B091 E585 B1E5 928C E59B BD前面10组组成的字为:涓崕浜烘皯鍏卞拰鍥最后剩下一个:BD,在 GBK 编码中 BD 没有被编码,则以 ?(3F)来代替了,
    这时原序列已经被损坏,是没有办法再还原的。
      

  11.   

    从上面可以看出,奇数个 UTF-8 编码的字符,字节数肯定是个奇数,不能被 GBK 完全编码,最后一个字节被损坏掉了。而偶数个字符,字节数肯定是个偶数,能被占用两个字节的 GBK 完全编码。
      

  12.   

    这仅仅是汉字的,如果夹杂着占用两个字节或者一个字节的 UTF-8 字符,情况也是同样的。所以不能使用 UTF-8 → GBK → UTF-8,这样是行不通的。