黑马程序员技术交流社区

标题: 关于编解码的问题 [打印本页]

作者: 李晓璐    时间: 2011-8-4 11:57
标题: 关于编解码的问题
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先编码后解码,想看看过程是不是可逆,但输出是乱码!请问为什么先解后编和先编后解不是相互可逆的过程呢?
作者: 匿名    时间: 2011-8-4 12:00
其实对于先解后编,如果所选字符集不是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,不可逆。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2