首頁  >  問答  >  主體

Java 两系统接口调用字符乱码问题?

PHP中文网PHP中文网2741 天前420

全部回覆(4)我來回復

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:05:23

    你得理解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之類的方法。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-18 10:05:23

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

    回覆
    0
  • ringa_lee

    ringa_lee2017-04-18 10:05:23

    如果你是客戶端:
    你從服務端拿到的字串是 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");  

    回覆
    0
  • 迷茫

    迷茫2017-04-18 10:05:23

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

    回覆
    0
  • 取消回覆