Android中使用HttpConnection傳送中文到伺服器端亂碼解決辦法
阿新 • • 發佈:2019-01-11
最近在寫一個簡單地案例,是將二維碼掃描的資訊傳送到伺服器端,並存儲到資料庫。以前的測試都是用英文,沒出什麼問題,今天試了一下中文,卻發現傳到伺服器端的全是亂碼。
解決步驟:
1、伺服器端是用PHP來寫,所以在保證檔案儲存為utf-8格式的前提下,在加上頭宣告:header("Content-type: text/html; charset=utf-8");
可亂碼依舊,將伺服器端獲取到的亂碼拿到,試圖解碼,發現並不行。
2、看來問題出在客戶端。客戶端是用 HttpURLConnection的連線,補上這兩句connection.setRequestProperty("Accept-Charset", "UTF-8");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
設定了客戶端的編碼格式,包括檢查專案的編碼方式,都是utf-8。無奈尋求Google,最終發現問題
錯誤程式碼:
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.writeBytes(paramsStr.toString());
改正後:
DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream()); outputStream.write(paramsStr.toString().getBytes());
可以看出主要問題出在writeBytes()和write()這兒
void write(byte[] b) -------- 把引數b指定的位元組陣列中的所有位元組寫入到輸出流中,將 b.length 個位元組從指定的 byte 陣列寫入此輸出流。
void writeBytes(String s) ----- 以位元組序列的形式向文字中寫入一個字串,寫入一個位元組到底層流為1 個位元組的值。成功執行此方法該計數器加1遞增。
在java中,中文為一個char,也就是兩個位元組16位,直接使用writeBytes,會丟棄高8位,只寫入低8位的一個位元組所以會造成中文亂碼。而改正後的方式是先存入位元組陣列,然後再寫入到輸出流,不會亂碼。