ByteArray to String过程中的编码问题
2017-04-20 16:00
295 查看
最近因为工作需要,有一个不太常见的需求,中间遇到了一些不太常见的编码的坑,特此记录。因为环境限制,开发语言为Java。
需求可以概括为:
发送端将数据序列化后得到的二进制byte数组转为String
接收端接收String后转为byte数组再反序列化为原始数据。
因为发送端是别人开发完成的,我只负责接收端的工作。拿到的String是UTF-8编码的,转为byte数组后反序列化校验失败。
因为序列化使用的是Avro,非常成熟,所以怀疑是编码问题。将String转换后的byte数组依次输出,发现很多-17 -65 -67,基本可以确定了,于是写了个小程序验证了一下。
程序输出结果为:
果然UTF-8编码时,一些byte中的信息会丢失。因此在这种转换中不能使用UTF-8编码。那么应该用哪种编码呢?
输出结果为:
发现ISO-8859-1没有问题。原因是ISO-8859-1是单字节编码,所以不存在不能识别的编码。而UTF-8会将不识别的编码标为-17 -65 -67,GBK会将不识别的编码标为63。以后再遇到这种情况就可以很方便的发现编码问题的特征了。
需求可以概括为:
发送端将数据序列化后得到的二进制byte数组转为String
接收端接收String后转为byte数组再反序列化为原始数据。
因为发送端是别人开发完成的,我只负责接收端的工作。拿到的String是UTF-8编码的,转为byte数组后反序列化校验失败。
因为序列化使用的是Avro,非常成熟,所以怀疑是编码问题。将String转换后的byte数组依次输出,发现很多-17 -65 -67,基本可以确定了,于是写了个小程序验证了一下。
public class ByteArrayToString { public static void main(String[] args) throws IOException{ byte[] myByte={115, -110, -1, -2, -3, -4}; System.out.println("-----UTF-8-----"); String utf8Str=new String(myByte, "utf8"); byte[] utf8Byte=utf8Str.getBytes("utf8"); for(byte b:utf8Byte) { System.out.print(b); System.out.print(' '); } System.out.println(); } }
程序输出结果为:
-----UTF-8----- 115 -17 -65 -67 -17 -65 -67 -17 -65 -67 -17 -65 -67 -17 -65 -67
果然UTF-8编码时,一些byte中的信息会丢失。因此在这种转换中不能使用UTF-8编码。那么应该用哪种编码呢?
public class ByteArrayToString { public static void main(String[] args) throws IOException{ byte[] myByte={115, -110, -1, -2, -3, -4}; System.out.println("-----UTF-8-----"); String utf8Str=new String(myByte, "utf8"); byte[] utf8Byte=utf8Str.getBytes("utf8"); for(byte b:utf8Byte) { System.out.print(b); System.out.print(' '); } System.out.println(); System.out.println("-----GBK-----"); String gbkStr=new String(myByte, "gbk"); byte[] gbkByte=gbkStr.getBytes("gbk"); for(byte b:gbkByte) { System.out.print(b); System.out.print(' '); } System.out.println(); System.out.println("-----ISO-8859-1-----"); String isoStr=new String(myByte, "ISO-8859-1"); byte[] isoByte=isoStr.getBytes("ISO-8859-1"); for(byte b:isoByte) { System.out.print(b); System.out.print(' '); } System.out.println(); } }
输出结果为:
-----UTF-8----- 115 -17 -65 -67 -17 -65 -67 -17 -65 -67 -17 -65 -67 -17 -65 -67-----GBK-----
115 63 -2 -3 63
-----ISO-8859-1-----
115 -110 -1 -2 -3 -4
发现ISO-8859-1没有问题。原因是ISO-8859-1是单字节编码,所以不存在不能识别的编码。而UTF-8会将不识别的编码标为-17 -65 -67,GBK会将不识别的编码标为63。以后再遇到这种情况就可以很方便的发现编码问题的特征了。
相关文章推荐
- 编码 -- char 1= '中' 2 byte, 中文string a="中" 3字节问题
- Go string to ascii byte array
- as3加密DES过程中,1、字符串转成ByteArray(byte数组)形式 ,2、ByteArray编码成base64 3、把ByteArray转换为16进制的形式的字符串
- token 6.x-1.17 "preg_match_all() expects parameter 2 to be string, array given in token_scan()" 问题解决
- Astyle Cannot convert to multi-byte string, reverting to English 问题解决办法-重新编译
- byte[]转String,编码与乱码问题,以及Base64编码
- byte-array-to-string-transformer 作用
- byte[]、String转换中文编码问题
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- 编码 -- char 1= '中' 2 byte, 中文string a="中" 3字节问题
- struts2 下载问题java.lang.ClassCastException: java.io.ByteArrayInputStream cannot be cast to
- string to byte array ----- byte array to string
- 【编码与乱码】(03)----String的toCharArray()方法
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- php,二维数组的输出出现了问题,提示:Notice: Array to string conversion
- php,二维数组的输出出现了问题,提示:Notice: Array to string conversion
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- convert a byte array to a hexadecimal string
- [Java]_[初级]_[utf8编码的byte[]数组转换为String时要注意的问题]
- AS3 String to ByteArray,ByteArray to String