1. 程式人生 > >使用http請求,中文亂碼問題--解決方法

使用http請求,中文亂碼問題--解決方法

最近寫了一個客戶端向伺服器端發起http請求的功能,伺服器端返回的資料中包含中文,奇怪的是中文個數是偶數個的時候,沒有亂碼,但是奇數個數時,最後一個漢字會程式設計問號?,以前也出現過類似問題,也解決了,但是沒有記錄,現在一下子想不到該怎麼解決了,

程式碼是這樣的:

伺服器端部分程式碼:

String str = "這個是中文亂碼測試程式碼" ;
System.out.println("伺服器返回的結果:");
			System.out.println(str);
			PrintWriter writer = resp.getWriter();
			writer.write(str);
			writer.flush();

接受端部分程式碼:
String result = HttpUtil.postToRest(HttpUtil.postUrl, HttpUtil.opttype,
				"service2", HttpUtil.data);
		System.out.println("掉用方接收到的資料1:" + result);


請求後返回資料,控制檯列印如下:

伺服器返回的結果:
這個是中文亂碼測試程式碼
掉用方接收到的資料1:?????????????????


在網上找了一些也沒有發現解決方法,大概意思都是說是因為tomcat使用的是gbk編碼,gbk一個漢字兩個位元組,utf-8一個漢字三個位元組,然後經過轉碼就會發生?亂碼問題,如其中有一篇部落格是這樣講的:

UTF-8中,一個漢字3個位元組,GBK中一個漢字2個位元組,我好像明白了什麼。。

 

  因為jetty容器預設是按照系統編碼來決定容器編碼,前提是沒有自己修改啟動編碼,而公司裡我臺PC是windows的,好像預設GBK的,反正我對windows緋聞也挺多的,於是這裡有一個問題,比如jetty接受到了一串經過UTF-8編碼的漢字:

  我很好

  jetty收到的最原始的二進位制陣列是這樣的:

  [-26, -120, -111, -27, -66, -120, -27, -91, -67]

  當然這不是最原始的,最原始的0和1,當然為了好看就算他是最原始的吧,下一步jetty要開始編碼了,按照jetty的GBK編碼,他按照2個位元組一個漢字的格式去編碼,於是出現了這樣的組合:

  [-26, -120]  [ -111, -27]  [-66, -120]  [-27, -91]  [-67]

  前面每兩個位元組都能找到對應的漢字,最後jetty發現最後居然只有一個位元組,找不到對應的漢字,心裡想這SB是哪來的,於是jetty放棄它了,把它趕出去,把63丟過去,於是最後的組合成了:

  [-26, -120]  [ -111, -27]  [-66, -120]  [-27, -91]  [63]

  經過GBK的格式編碼,兩個位元組對應一個漢字,就顯示出了這樣的東西:

  騫茶帿瀛?

  會出現5個,因為每2個位元組代表一個漢字,最後一個位元組是63,對應的符號是?,就出現了上面的東西,於是我對它做了強制的UTF-8編碼,導致上面的二進位制陣列重新組合,經過UTF-8的組合之後,二進位制陣列成了這樣:

  [-26, -120, -111] [-27, -66, -120] [-27, -91, 63]

  再經過UTF-8顯示之後,變成了這樣:

  我很�?

  前6個位元組能夠正常的顯示出漢字,因為那就是真正的資料,然而最後3個位元組,已經被GBK處理了,替換過了,即使使用UTF-8也無法還原它原來的容貌,於是它就顯示成了上面的樣子,但是為什麼偶數不會出錯?

  因為偶數能夠被GBK正常的解碼,也就是如果漢字是偶數,UTF-8和GBK是等同的,但是如果是奇數,則就出問題了,這也是傳說中的最後一個漢字亂碼的問題,因為最後一個 位元組始終是63,要解決這個問題,必須要治標還要治本,專案中必須全程保證編碼一致性。

文章摘自:http://www.cnblogs.com/gudi/p/4086183.html

折騰了好一會時間,忽然想到以前使用的是

java.net.URLEncoder

就是說伺服器端在返回帶有中文資料的時候,將字串使用URLEncoder.encode(str)加碼,

然後在呼叫介面端,接收到資料

java.net.URLDecoder 也就是URLDecoder.decode(str)技術解碼,這樣就可以完美的解決問題了。

具體程式碼如下:

伺服器端部分返回程式碼:

String str= "這個是中文亂碼測試程式碼" ;
str = URLEncoder.encode(str);
System.out.println("伺服器返回的結果:");
			System.out.println(str);
			PrintWriter writer = resp.getWriter();
			writer.write(str);
			writer.flush();

呼叫端部分程式碼:
String result = HttpUtil.postToRest(HttpUtil.postUrl, HttpUtil.opttype,
				"service2", HttpUtil.data);
		result = URLDecoder.decode(result) ;
		System.out.println("掉用方接收到的資料1:" + result);


控制檯列印資訊如下:

伺服器返回的結果:
%D5%E2%B8%F6%CA%C7%D6%D0%CE%C4%C2%D2%C2%EB%B2%E2%CA%D4%B4%FA%C2%EB
掉用方接收到的資料1:這個是中文亂碼測試程式碼


相關推薦

使用http請求中文亂碼問題--解決方法

最近寫了一個客戶端向伺服器端發起http請求的功能,伺服器端返回的資料中包含中文,奇怪的是中文個數是偶數個的時候,沒有亂碼,但是奇數個數時,最後一個漢字會程式設計問號?,以前也出現過類似問題,也解決了

Django 分頁查詢並返回jsons數據中文亂碼解決方法

返回json 類型 模型 數據流 class stringio self option sci Django 分頁查詢並返回jsons數據,中文亂碼解決方法 一、引子 Django 分頁查詢並返回 json ,需要將返回的 queryset 序列化, demo 如下: #

LoadRunner接口HTTP請求中文亂碼解決方案

空格 con value 發送 nbsp toe string ner 字符串 今天項目經理要求壓一下實時代扣接口性能。那就開始寫腳本,腳本寫好調試發現接口請求參數姓名輸入中文亂碼。接著就網上找資料解決該問題。 1:想法:將中文轉成UTF-8,lr_convert_stri

Tomcat視窗標題中文亂碼解決方法

   工作中,或多或少的原因,一臺伺服器中需要同時執行多個Tomcat服務(針對一臺伺服器如何同時執行多個Tomcat的配置,這裡不做論述,百度很多),為了便於區分各個Tomcat的功能,通常會選擇修改

get請求中文亂碼解決 之 百度如何正確獲取中文請求引數(我猜測)

url查詢串不直接支援中文等非ASCII碼錶符號的傳輸,需要經過瀏覽器採取一種編碼方案將中文字元編碼為可用於url傳輸的符號(也就是ASCII碼的符號)。除這種類似中文查詢串的情況外,url中有特殊用途的符號,例如%,@, :, &,#,?等也不能直接傳輸,同樣需

關於http請求返回資料中文亂碼解決方法

在你的http工具類中 有 in = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8")); 這行程式碼,注意將 ,"utf-8" 加入到輸入流,這樣在源頭

php var_dump 列印不全中文亂碼解決方法

列印不全: 解決方法: 在php.ini裡的xdebug節點中,追加一下配置: 1 2 3 4 5 xdebug.var_display_max_children=128 xdebug.var_display_max_data=512

c#匯出檔案檔名中文亂碼解決方法

public string clFielName(string fileName) { System.Web.HttpContext curContext = System.Web.HttpContext.Current; string outputFile

c#導出文件文件名中文亂碼解決方法

urn ont 導出 com filename tps 中文 str 文件名 public string clFielName(string fileName) { System.Web.HttpContext curContext = Sy

idea軟體編碼已經設定好了為utf-8但是svn中down下來的檔案格式本身不是utf-8的此時開啟後會出現中文亂碼解決方法

我是個idea的忠實使用者,新公司的專案都是用eclipse做的,通過svn拉下程式碼後發現,註釋的內容裡,中文內容都是亂碼。問過專案負責人,說可能是GBK編碼。 但是,我通過idea的setting設定了編碼,試了5種編碼都沒用,中文內容還是亂碼。最後還是自己試出來解決方案。 詳細的原因請參考

SSM 後臺返回資料給前臺json中文亂碼解決方法

場景: 在實際運用場景中,當前臺發起請求後,我們需要從後臺返回資料給前臺,這時,如果返回的資料中包含中文,則經常會出現在後臺查詢出來都是好好,但是傳輸回去就莫名的亂碼了,而且,我們明明已經在 web.

loadrunner 播放指令碼後日誌顯示中文亂碼解決方法

在這裡教大家一個最簡單的方法,可以使日誌中文亂碼變成正常 在你的指令碼中再建立一個action,在這個新建的action頁面中,點選‘錄製按鈕’,彈出錄製設定頁面後,點選左下角‘設定’,在HTTP Properties - Advaced頁面,勾選Support chars

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

https://my.oschina.net/angerbaby/blog/207774摘要: 在jsp中常見的亂碼解決辦法無外乎是關於get和post兩種方式的,但只有切實地在實踐中使用時才會注意或者說注重到其他方式。例如,在http請求頭中傳送中文引數,出現亂碼,如何解決

Eclipse的properties文件中文亂碼解決方法

text content elf abd 問題 clas nbsp ips -o 轉自:http://jingyan.baidu.com/article/ed2a5d1f3381d709f6be17f8.html 打開Myeclipse,找到window這一欄,點

Codeblocks 中文亂碼解決方法

gif www 有效 file odi fault 輸入 打開文件 一個 1.修改源文件保存編碼 settings->Editor->gernal settings 右邊的Encoding group Box Use encoding when openin

get、post請求參數亂碼解決方法(qq:2798641729)

enc pos http bin imp 解決 encoding 亂碼問題 轉碼 在實際的項目中我們會遇見中文亂碼的問題,這個問題是很惡心的事,所以我在這裏提供了一些解決中文亂碼的方法,希望能給大家一些幫助。 一、單獨參數亂碼 post請求:request.setChar

前臺傳參到後臺中文亂碼解決方法

sele watermark img -o reset 圖片 亂碼 字符 size 解決前端傳參到後臺的字符集編碼問題!!!第一種:---java的web.xml中加上字符集過濾 (推薦使用)<filter> <filter-name>

sublime 中文亂碼解決方法

1.sublime 中 preference -> browse->packages 2.在彈出的視窗返回上一層 找到Installed Packages 資料夾 3.下載檔案 放到這個Installed Packages資料夾裡面

Qt5中文亂碼解決方法

Qt中的中文顯示,經常會出現亂碼,但在UI設計介面上新增的中文是不會出現亂碼的,如果你剛使用QT,那麼你肯定會碰到這個問題。 網上搜索一下,找到的都是這種: #include < QTextCodec > int main(int argc, char **argv) { .

Java讀寫文件中文亂碼解決

中文亂碼解決 eat 存在 讀文件 如果 清空 writer 讀寫 utf 讀文件:使用new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));      StringBu