java中关于编解码问题

来源:百度知道 编辑:UC知道 时间:2024/09/27 19:21:10
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先编码后解码,想看看过程是不是可逆,但输出是乱码!请问为什么先解后编和先编后解不是相互可逆的过程呢?

其实对于先解后编,如果所选字符集不是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,不可逆。

ascii编码 http://harrywu304.bokee.com/inc/20041103125427993184.gif
iso-8859-1编码 http://harrywu304.bokee.com/inc/20041103125453151747.gif