關於java發送http請求時中文亂碼的一種解決辦法

    在jsp中常見的亂碼解決辦法無外乎是關於get和post兩種方式的,但只有切實地在實踐中使用時纔會注意或者說注重到其餘方式。例如,在http請求頭中傳送中文參數,出現亂碼,如何解決? java

    實際場景:使用Spring提供的RestTemplate向WebService發送put請求,使用HttpHeader類裝載須要傳遞的參數(包括中文)。請求端系統使用的是utf-8編碼,而服務端使用的是gbk編碼,使用http監聽工具查看所發出的http請求信息,發現header中的中文參數亂碼。 json

    嘗試的方法: 服務器

    1. 在服務端接收到參數時,utf-8轉gbk,無效。
    2. 在服務端接收到參數時,iso-8859-1轉gbk,無效。
    3. 在發送請求前將中文參數轉碼,utf-8轉iso-8859-1,無效。代碼以下: app

new String(remark.getBytes("UTF-8"), "ISO-8859-1")
     4. 在請求端,HttpHeader設定ContentType爲「application/json;UTF-8",無效。代碼以下:
headers.setContentType(Media.valueOf("application/json;UTF-8"));

    寫到這裏,有人應該感受到這有點「病急亂投醫」的感受了,沒有頭緒地在試着各類方式。是的,起初我以爲是請求header中採用了ISO-8859-1的編碼,但嘗試後很顯然不是;後來我覺着是不是RestTemplate中採用的HttpMessageConverter方式所決定的,但沒能找到很好的證實方式,查資料說的是StringHttpMessageConverter默認採用的是ISO-8859-1編碼,可我以爲我指定了ContentType爲application/json,RestTemplate不該該去調用StringHttpMessageConverter啊,其中的原理還有待深究。我的感受這種狀況出問題的可能性最大。 jsp

    最後,在網上看到一篇文章後,看了一種建議方式,而且是可行的,就是使用URLEncode,將中文參數在傳參前進行encode。這裏以GBK編碼是爲了在服務器端接收參數後無需再轉碼了,以下: 工具

list.add(URLEncode.encode(name, "GBK"));

    URLEncode方式能夠解決這種特定場景的中文亂碼問題,相信理解其原理後還能夠運用到更多的場景。目前我在網上看到的,關於用URLEncode處理中文亂碼最多的場景就是文件下載時中文文件名亂碼。 post

    關於Java中文亂碼的原理及解決辦法能夠參看一下下面的連接,頗有用。 編碼

    http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/ spa

相關文章
相關標籤/搜索