目录
一、写这玩意的起因
1、遇到问题
工作中遇到个当时看不出错误的问题,解决后,就想写下来记录与分享下
二、问题查找与解决
1、问题的出现
一般来说工作的系统程序就接受请求,处理,发送返回结果三步。
当时程序写好之后,运行成功的,由于该交易没有需要处理,也就透传数据,所以就没有在意。没想到遇到报错,尝试多次后,发现是只要有个中文点—— ·(就这个点),只要有他对方就解析失败。与对方查了很久,我这边发送的内容看起来没有问题,他们解析失败,说是给他们的长度和实际报文长度不一样导致解析失败。
2、查找与分析
❶首先想到是否是通讯方式的问题。一想不管啥通讯方式肯定都使用这么些年了,就算有问题也修复了吧,不然也肯定有解决方法。排除
❷然后检查了数据,整理思路。接收到数据是平台解析的,查看解析后数据是没有问题的,自动计算的长度,应该没有问题,否则其他数据就应该也出问题。现在的问题是加了 · 就不行,其他的符号、中文、英文、数字对方都能正常解析,那么平台解析和算长度肯定是正确的。
❸从头到尾检查,发送的数据打印出来也对着的。只有长度问题了,猜想是否重新计算了长度,导致长度与内容无法匹配。但是想起,不管是接收还是发送解析计算都是同一个,不应该有问题。排除
❹没办法,只能加打印试问题在哪。
先发了一遍解析不了的报文,检查各个位置的打印
再发一遍去掉那个中文点的报文,检查各个位置的打印
对比后发现问题,两个报文进来时候,长度相差2
但是发送的时候转换格式后长度相差1
具体检查代码发现发送的方法,入参为 服务名,发送的内容byte数组和长度 三个。
中间有了类型转换处理
如上图,此处把byte[]转换为String
打印后发现长度差距变化了,本来长度差2,转换后长度差1
能想到的就是编码问题了于是修改为 new String(sendByte,"UTF-8")
运行后还是对方解析不了
于是也就只能求助百度了,找到了一篇文章
http://t.csdn.cn/2lD5dhttp://t.csdn.cn/2lD5d看过之后,先写了个mian方法试了下,确定编码不同可能会导致字节长度不同,于是改掉代码试着运行了下,解决了。
尝试的mian方法如下
public class test {
public static void main(String[] args) throws UnsupportedEncodingException {
// String a = "大·二";
// System.out.println(a.length());
// byte[] b = a.getBytes();
byte[] b = new byte[] {23,43,42,-23,-32,43};
System.out.println(b.length);
System.out.println("-----无------");
String c1 = new String(b);
System.out.println("c1=="+c1.length());
byte[] d1 = c1.getBytes();
System.out.println("byte[] d1=="+d1.length);
System.out.println("-----ISO-8859-1------");
String c2 = new String(b,"ISO-8859-1");
System.out.println("c2=="+c2.length());
byte[] d2 = c2.getBytes();
System.out.println("byte[] d2=="+d2.length);
System.out.println("-----UTF-8------");
String c3 = new String(b,"UTF-8");
System.out.println("c3=="+c3.length());
byte[] d3 = c3.getBytes();
System.out.println("byte[] d3=="+d3.length);
System.out.println("-----GBK------");
String c4 = new String(b,"GBK");
System.out.println("c4=="+c4.length());
byte[] d4 = c4.getBytes();
System.out.println("byte[] d4=="+d4.length);
}
}
运行结果如下
6
-----无------
c1==6
byte[] d1==10
-----ISO-8859-1------
c2==6
byte[] d2==8
-----UTF-8------
c3==6
byte[] d3==10
-----GBK------
c4==5
byte[] d4==7
最终使用 new String(b,"ISO-8859-1") 方法把byte[]转换成String 解决了问题
总之呢,若遇到byte[]转String时丢失字节的问题,您可以试下"ISO-8859-1"这个编码