關於java傳送http請求時中文亂碼的一種解決辦法
摘要: 在jsp中常見的亂碼解決辦法無外乎是關於get和post兩種方式的,但只有切實地在實踐中使用時才會注意或者說注重到其他方式。例如,在http請求頭中傳送中文引數,出現亂碼,如何解決?
在jsp中常見的亂碼解決辦法無外乎是關於get和post兩種方式的,但只有切實地在實踐中使用時才會注意或者說注重到其他方式。例如,在http請求頭中傳送中文引數,出現亂碼,如何解決?
實際場景:使用Spring提供的RestTemplate向WebService傳送put請求,使用HttpHeader類裝載需要傳遞的引數(包括中文)。請求端系統使用的是utf-8編碼,而服務端使用的是gbk編碼,使用http監聽工具檢視所發出的http請求資訊,發現header中的中文引數亂碼。
嘗試的方法:
1. 在服務端接收到引數時,utf-8轉gbk,無效。
2. 在服務端接收到引數時,iso-8859-1轉gbk,無效。
3. 在傳送請求前將中文引數轉碼,utf-8轉iso-8859-1,無效。程式碼如下:
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啊,其中的原理還有待深究。個人感覺這種情況出問題的可能性最大。
最後,在網上看到一篇文章後,看了一種建議方式,並且是可行的,就是使用URLEncode,將中文引數在傳參前進行encode。這裡以GBK編碼是為了在伺服器端接收引數後無需再轉碼了,如下:
list.add(URLEncode.encode(name, "GBK"));
URLEncode方式可以解決這種特定場景的中文亂碼問題,相信理解其原理後還可以運用到更多的場景。目前我在網上看到的,關於用URLEncode處理中文亂碼最多的場景就是檔案下載時中文檔名亂碼。
關於Java中文亂碼的原理及解決辦法可以參看一下下面的連結,很有用。