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處理中文亂碼最多的場景就是文件下載時中文文件名亂碼。