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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓璐 黑马帝   /  2011-8-4 11:57  /  2140 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String str=new String(buf,0,i,"ISO-8859-1");  //对其用另一个方式解码
//重新编码后再用GBK解码
String strGBK=new String(str.getBytes("ISO-8859-1")/*重新编码*/,"GBK");
System.out.println(strGBK);  //得到正确的中文字符
读入中文存入字节数组buf中,用ISO-8859-1解码,再用ISO..编码,则还能正确输出中文字符。那就是说:解码再编码是不会丢失数据的对吗?

但是反之不然,即先编码再解码:
String strGBK2=new String(buf,0,i); //得到GBK解码的strGBK2
String strLast=new String(strGBK2.getBytes("ISO-8859-1"),"ISO-8859-1");
System.out.println(strLast);   //输出是乱码
上面对strGBK2先编码后解码,想看看过程是不是可逆,但输出是乱码!请问为什么先解后编和先编后解不是相互可逆的过程呢?

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 编码问题是经典问题

查看全部评分

1 个回复

倒序浏览
黑马网友  发表于 2011-8-4 12:00:41
沙发
其实对于先解后编,如果所选字符集不是ISO-8859-1,也会产生乱码的。
举个例子。
我有个byte = 0xfa ,在ISO-8859-1中,它对应字符是ú,输出ú,但在ascii中,它没有对应的字符,这时就输出?(问号),在ISO-8859-1和ascii中,?(问号)的编码都是0x3f,如果这时再把输出的字符编码,在ISO-8859-1中,因为输出ú,找出对应的编码code,是0xfa,保存为字节数组,这时可逆的,但在ascii中,因为输出是?,找出?对应的code,为0x3f,保存为字节数组,与0xfa 不同,这时已经是乱码了,且不可逆。不可能从0x3f回到0xfa 了。

对于你的第一个例子,因为ISO-8859-1在0x00-0xff都有对应的char,也能从这些char找回code,信息是不会丢失的。如果你用ascii的话就不会那么好运了。因为ascii只在0x00-0x7f有对应的char,0x80-0xff都返回问号给你。问号用ascii编码就是0x3f了。

先编后解的话,因为ISO-8859-1里没有中文字符的code,既然找不到code,那么就返回个?给你,呵呵,全部是0x3f,不可逆。

评分

参与人数 1技术分 +2 收起 理由
老罗 + 2 这个编码问题要一次搞明白了。

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马