String str = "中";
  
  
  String str1 = new String(str.getBytes("gbk"), "ISO8859-1");
  String str2 = new String(str1.getBytes("ISO8859-1"), "gbk");
  System.out.println(str2);  //输出"中"
  
  
  String s1 = new String(str.getBytes("gbk"), "utf-8");
  String s2 = new String(s1.getBytes("utf-8"), "gbk");
  System.out.println(s2); //输出"锟斤拷"使用iso8859-1进行解释后,可以恢复回去,
可使用utf-8解释了中文字符后,为何恢复不回去了? 请将详细写吧。 

解决方案 »

  1.   

    两种转换编码的格式不一样 楼主可以把转换后的格式也输出来看一下
    看一下下面这段说明 你就会明白为什么UTF-8 就不是输出中文了
    GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的网站则用UTF-8节省空间。GBK包含全部中文字符;UTF-8则包含全世界所有国家需要用到的字符。GBK是在国家标准GB2312基础上扩容后兼容GB2312的标准,UTF-8编码的文字可以在各国各种支持UTF8字符集的浏览器上显示。
    比如,如果是UTF8编码,则在外国人的英文IE上也能显示中文,而无需他们下载IE的中文语言支持包。 所以,对于英文比较多的论坛 ,使用GBK则每个字符占用2个字节,而使用UTF-8英文却只占一个字节。
     
      

  2.   


    gbk的英文是单字节吧,中文才双字节。
    unicode中英文都是双字节。
      

  3.   

    我是根据我们老师讲的给你说说
    老师给我们举得例子是“我们”内存里面现在是这样的。s = 00ce 00d2 00c3 00c7,把这个字符串对象再编码成gbk是错误的。因为,在unicode中,00ce所代表的是iso8859-1那个字符,在gbk编码表里面并没有收录进来,所以没法编码成gbk,而且如果找不到匹配的字符,jvm不会报错,而是返回错误的结果。3f 3f 3f 3f
    应该是utf-8里没有收录吧
      

  4.   

    你这个帖子跟这个帖子问题类似,有趣的话可以去看看:http://topic.csdn.net/u/20080623/16/e0f44f00-eaf9-4d38-b325-a3cc443f2ec9.html
      

  5.   

    这是由于在 GBK 转成 UTF-8 时就产生了错误,具体为什么会错误,请先看看
    楼上那个帖子 11 楼的内容,将在那些基础上进行说明。因为“中”的 GBK 编码为 D6D0,使用 getBytes("gbk") 后会转成 D6 D0 的字节数组。通过那个帖子关于 UTF-8 的编码规则表,先看第一个字节 D6,二进制为 11010110,因此可用的 UTF-8
    采用第二行的规则,即:110xxxxx 10xxxxxx,根据这一行规则,要求第二个字节二进制是以 10 开头的,
    但是我们第二个字节 D0 的二进制为 11010000,因此不符合 UTF-8 的编码规则,因此将采用 UTF-8 的
    缺失字符 EF BF BD 将其进行编码,因为 D6 D0 这两个字节 UTF-8 都不认识,因此被 UTF-8 编码成为
    EF BF BD EF BF BD 共 6 个字节的两个缺失字符。这 6 个字符再根据 GBK 的编码规则,每两个组成一个字符,因此被 GBK 编码为 EFBF BDEF BFBD,而编
    码为这三个的 GBK 字符正好为“锟斤拷”。
      

  6.   

    请问这个图怎么看啊
    gbk和图中的unicode utf-8有什么关系啊?Unicode Code    UTF-8 Code
     0000~007F     0xxxxxxx
     0080~07FF     110xxxxx 10xxxxxx
     0800~FFFF     1110xxxx 10xxxxxx 10xxxxxx
    10000~10FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      

  7.   

    这个表只是 UTF-8 的编码规则,跟 GBK 没有丝毫关系
      

  8.   

    Unicode Code    UTF-8 Code
     0000~007F     0xxxxxxx
     0080~07FF     110xxxxx 10xxxxxx
     0800~FFFF     1110xxxx 10xxxxxx 10xxxxxx
    10000~10FFFF   11110xxx 10xxxxxx 10xxxxxx 10xxxxxx这个图怎么看?左边一列是 Unicode 编码,右边一列是 UTF-8 编码。我们只要看右边的,右边的是 UTF-8 的编码规则,
    即:第一行 0xxxxxxx 表示 U+0000~U+007F 的字符,UTF-8 使用一个字节表示
    第二行表示 U+0080~U+07FF 的字符,UTF-8 编码使用两个字节表示,首字节必须是 110 开头,第二个字节必须是以 10 开头的,也就是说如果第一个字节是以 110 开头的,但是第二个字节是以 11 开头的,那么这样的字节是不能组成 UTF-8 编码的,会采用缺失字符代替。
    好了,该说的都已经说完了,对于这个帖子不会再回复了。
      

  9.   

    请问为什么UTF-8解码不出来却要去改变原字节数据?这样设计的目的是何?
      

  10.   

    那为什么ISO8859-1解码不出来就不去改变原来的字节数据呢?String s = "中";
    byte[] bytes = s.getBytes("GBK");
    for(byte b : bytes) System.out.println(b);

    String s2 = new String(bytes, "ISO8859-1");
    System.out.println(s2);
    byte[] bytes2 = s2.getBytes("ISO8859-1");
    for(byte b : bytes2) System.out.println(b);
      

  11.   

    ISO 8859-1 只采用一个字节来表示字符,当然可以按字节来拆。但是像 GBK,UTF-8 的字符是采用多字节来表示,多字节的话就必须有规范,否则编码就会乱套