本来,我想将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里的字节数组就跟原来的字节数组一样。