Java 两系统接口调用字符乱码问题?
PHP中文网
PHP中文网 2017-04-18 10:03:23
0
4
449
PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(4)
伊谢尔伦

你得理解new String(str.getBytes("GBK"),"UTF-8");這句話的意義,才能知道為什麼會失敗。
首先,Java裡的String內部是UTF-16LE編碼的。
str.getBytes("GBK"),得到了一個Byte數組,內容是將str的編碼轉換為GBK。
new String(str.getBytes("GBK"),"UTF-8"),則是將這個Byte數組的內容當作UTF-8編碼的數據,轉換為String(UTF-16LE)。
明白了?這樣能行才有鬼呢。

客戶端和伺服器,他們只都是Java,那Java裡的String編碼一定是UTF-16。不會受到系統編碼(Windows或Linux)的影響。
這種情況下最好不直接傳送String,因為String會被你用的函式庫它自動轉換編碼(以tomcat為例,預設iso8859-1)。

如果你可以直接發送和接收Byte數組,那麼你完全可以將協定規定UTF-8。任何一方接受資料都是new String(data, "UTF-8"),傳送資料都是str.getBytes("UTF-8")。

如果客戶端程式碼你改不了或用C等別的語言寫的。 你確定客戶端發送的是GBK資料的話。 如果你伺服器能直接接收Byte陣列,new String(data, "GBK"),這樣就能解析。回傳的時候同樣是Byte數組str.getBytes("GBK")。

如果只能發送和接收String,那麼你需要配置它,設定它轉換的編碼。例如對於tomcat,對於GET的數據,需要修改web.xml,增加一個URL編碼設定項。對於POST數據,則必須寫一個filter來轉換。如果是HTTP通訊類,則可能提供SetEncoding之類的方法。

Ty80

如果是網址的話可以使用URLEncoder/URLDecoder類別

左手右手慢动作

如果你是客戶端:
你從服務端拿到的字串是 utf-8 編碼,你需要顯示的話,先將把字串按照 utf-8 解碼成字節碼,然後再按照 GBK編碼。
你傳送給服務端的字串也得是 utf-8 編碼, 你需要將你的GBK編碼的字串,解碼成字節碼,然後再按照 utf-8 編碼。
反之亦然。
之所以你看到的是亂碼,可能是你的終端的編碼問題?

String gbkStr = new String(utf8Str.getBytes("utf-8"),"gbk");  
String utf8Str = new String(gbkStr.getBytes("gbk"),"utf-8");  
迷茫

可以透過iso8859-1編碼作為中間字串,如果gbk直接轉utf–8時,即2位元組轉3位元組。若是奇數個漢字,最後一個位元組轉換時會計算錯誤輸出? ,還是會亂碼。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板