A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马州州 中级黑马   /  2012-9-28 01:36  /  1165 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.util.*;
class EncodeDemo
{
        public static void main(String[] args) throws Exception
        {
                String s ="你好";
                byte[] b1 = s.getBytes("GBK");
                String s1 = new String(b1,"utf-8");
                byte[] b2 = s1.getBytes("GBK");
                String s2 = new String(b2,"utf-8");
       }
}
上面程序第一次用GBK编码,但是解码的时候用utf-8解得,然后又用GBK编码,又用utf-8解码
怎么通过编码解码还原成“你好”
理论是完全行的通的,但是我转了老长时间还是“???”

2 个回复

倒序浏览
首先,在编对了,解错的时候,要用解错的码再编回去,然后再用正确的码表解码。所以程序中后面再解回去的时候,
应该是  byte[] b2 = s1.getBytes("utf-8");      
            String s2 = new String(b2,"gbk");

但是,由于GBK和UTF-8码表都识别中文,所以这里还是会出现错误。如下,
public class Test
{
   public static void main(String[] args) throws Exception
   {
       String s ="你好";
       byte[] b1 = s.getBytes("gbk");
       System.out.println("b1 = "+Arrays.toString(b1));  // 这里可以看看它的编码:[-60, -29, -70, -61]
       String s1 = new String(b1,"utf-8");
       System.out.println(s1); // 由于GBK和UTF-8都识别中文,所以在解码时:???
      
       byte[] b2 = s1.getBytes("utf-8");      
       System.out.println("b2 = "+Arrays.toString(b2)); // 再用UTF-8编回去的时候:[-17, -65, -67, -17, -65, -67, -17, -65, -67]  拿到的源码已经发生的变化
       String s2 = new String(b2,"gbk");
       System.out.println(s2); // 所以再用GBK去解码时,是按照变化的源码进行解码的:锟斤拷锟?
  }

但是使用ISO8859-1就不会出现混乱的情况。这里要特别注意GBK和UTF-8。
}

评分

参与人数 1技术分 +1 收起 理由
王海宇 + 1

查看全部评分

回复 使用道具 举报
楼上回答真给力 句句带注释 好清晰
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马