近期在做项目时,遇到如下问题。先看代码:
class="java" name="code">
package test11;
public class TestStr {
public static void main(String[] args) throws Exception {
byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
String str2 = new String(bytE);
byte[] bytE2 = str2.getBytes();
for(byte b:bytE2){
System.out.print(b + ",");
}
}
}
测试结果:
24,63,61,102,-51,-78,17,126,
对于字节数组使用new String(bytE)转换后,再使用String类的getBytes()
编码还原,
发现编码前后字节数组不一致。经查默认情况下使用UTF-8编码,而UTF-8是可变长度的编码,原来的字节数组就被改变了,而ISO8859-1通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,它是单字节的编码方式,这样第二种方式生成的String里的字节数组就跟原来的字节数组一样(参考文章:http://blog.csdn.net/jiangxinyu/article/details/8228807)。因此将代码修正为如下,可以正常编码:
package test11;
public class TestStr {
public static void main(String[] args) throws Exception {
byte[] bytE = new byte[]{24, -122, 61, 102, -51, -78, 17, 126};
String str2 = new String(bytE,"ISO-8859-1");
byte[] bytE2 = str2.getBytes("ISO-8859-1");
for(byte b:bytE2){
System.out.print(b + ",");
}
}
}
在String--byte[]--String处理模式中,使用默认或者其它编码格式都可以;但在String--byte[]--byte[]--String--byte[]处理模式中,涉及字节数组被处理成新的字节数组后多次转换传递时,为了避免字节数组变化而影响结果,可以使用ISO-8859-1进行处理。在处理中文时,可以使用GBK或UTF-8,而不能使用ISO-8859-1,否则会出现乱码。因此模式二下同时涉及中文,可以使用两者
结合的方式,例如下边的代码:
package test11;
public class TestStr {
public static void main(String[] args) throws Exception {
String str = "张三";
String str1 = new String(str.getBytes("UTF-8"),"ISO-8859-1");
String str2 = new String(str1.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(str2);
}
}
注意:此处使用的是String类的构造方法传入编码方式进行的数据转换