java ascii的byte数组转换成string 出现乱码,byte[]转String乱码、数据不一致

本来,我想将byte[]数组在feign中传输,因为封装的返回对象中没有数组类型的返回值,且是同事的代码,传输byte[]并不常用,就不想改同事封装的对象。我就想着将byte[]数组转成String,再将String转成byte[]数组应该行得通。可事实却打脸了,拿到的byte[]数组和原来的byte[]数组的地址不一致,这是因为乱码导致;在转换过程中加上"ISO-8859-1"字符编码可以解决乱码问题。

先看两个例子。

1.示例一:String装byte[],再将byte[]数组转成String

String string = "String case to byte[]";

byte[] bytes = string.getBytes();

String newString = new String(bytes);

输出的结果显示string、newString字符串的值是一致的,转换正确。

2.示例二:byte[]数组转String,再将String转成byte[]

byte[] bytes = {-28, -72, -83, -27, -101, -67};

String string = new String(bytes);

byte[] newBytes = string.getBytes();

输出的byte[]字节数组的值为 {-28, -72, -83, -27, -101, -67}、newByte[]字节数组的值都为 {-28, -17, -65, -67, 2, -47},转换错误。

使用"ISO-8859-1"编码

byte[] bytes = {-28, -72, -83, -27, -101, -67};

String string = new String(bytes, "ISO-8859-1");

byte[] newBytes = string.getBytes("ISO-8859-1");

输出的byte[]字节数组、newByte[]字节数组的值都为 {-28, -72, -83, -27, -101, -67}, 转换正确

3.结论:

分析两个示例,String能够互转和byte[]不能够互转的原因,因为编码的原因导致转换乱码或者错误。在两个示例中我都没有显示的指定转换数据的编码,其实内部默认指定的编码规则是"UTF-8"。因为"UTF-8"是可变长编码,在String转byte[]再将byte[]转String的时候String字符串的大小是确定,String字符串不会改变长度。byte[]转String,再将String转byte[]的时候,String字符串会变长,再转回原来的byte[]数组就发生错误了。在java中"ISO-8859-1"编码可以解决转码错误的问题,ISO-8859-1通常叫做Latin-1,Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同,它是单字节的编码方式,这样第二种示例生成的String里的字节数组就跟原来的字节数组一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值