系统传输过程中 中文点 · 对方无法解析的问题查找
目錄
一、寫這玩意的起因
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"這個編碼
總結
以上是生活随笔為你收集整理的系统传输过程中 中文点 · 对方无法解析的问题查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一句关于爱情的话...
- 下一篇: java信息管理系统总结_java实现科