系统传输过程中 中文点 · 对方无法解析的问题查找

目录

一、写这玩意的起因

1、遇到问题

二、问题查找与解决

1、问题的出现

2、查找与分析


一、写这玩意的起因

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"这个编码

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞天神猴

希望对像我一样的初学者有所帮助

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值