关于字节编码问题

近期在做项目时,遇到如下问题。先看代码:

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里的字节数组就跟原来的字节数组一样(参考文章:[url]http://blog.csdn.net/jiangxinyu/article/details/8228807[/url])。因此将代码修正为如下,可以正常编码:
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类的构造方法传入编码方式进行的数据转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值