android POST數(shù)據(jù)遇到的UTF-8編碼(亂碼)問題解決辦法
今天遇到這樣一個bug:客戶端POST到服務(wù)器的一段數(shù)據(jù)導致服務(wù)器端發(fā)生未知異常。服務(wù)器端確認是編碼轉(zhuǎn)換錯誤。于是截取網(wǎng)絡(luò)數(shù)據(jù)包進行分析,發(fā)現(xiàn)客戶端POST的json數(shù)據(jù)中包含下面一段(hex形式):
問題就出在這個b7上。查閱Unicode代碼表后發(fā)現(xiàn),U+00b7是MIDDLE DOT,它的UTF-8表現(xiàn)形式應(yīng)該是c2 b7,但為何客戶端發(fā)送的數(shù)據(jù)中它變成了b7?
由于系統(tǒng)使用了ormlite、gson和async-http幾個庫,于是逐一排查。最后發(fā)現(xiàn)原來是向服務(wù)器發(fā)送數(shù)據(jù)時沒有指定文字編碼,導致async-http(實際是apache common http client)將數(shù)據(jù)以ISO-8559-1格式發(fā)送,U+00b7被編碼成b7,然后服務(wù)器試圖使用UTF-8解碼時發(fā)生錯誤。
出錯的代碼片段如下:
Gson gson = new Gson();
String json = gson.toJson(data);
StringEntity entity = new StringEntity(json);
httpClient.post(context, url, entity, "application/json", new TextHttpResponseHandler() ... );
第三行new StringEntity(json)時沒有指定編碼導致錯誤。改正后如下:
Gson gson = new Gson();
String json = gson.toJson(data);
StringEntity entity = new StringEntity(json, "utf-8");
httpClient.post(context, url, entity, "application/json;charset=utf-8", new TextHttpResponseHandler() ... );
相關(guān)文章
Android編程實現(xiàn)ImageView圖片拋物線動畫效果的方法
這篇文章主要介紹了Android編程實現(xiàn)ImageView圖片拋物線動畫效果的方法,實例分析了Android實現(xiàn)拋物線運動的算法原理與相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-10-10Flutter質(zhì)感設(shè)計之模態(tài)底部面板
這篇文章主要為大家詳細介紹了Flutter質(zhì)感設(shè)計之模態(tài)底部面板,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08Android UI設(shè)計與開發(fā)之使用ViewPager實現(xiàn)歡迎引導頁面
這篇文章主要為大家詳細介紹了Android UI設(shè)計與開發(fā)之使用ViewPager實現(xiàn)歡迎引導頁面,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08Android DragVideo實現(xiàn)播放視頻時任意拖拽的方法
這篇文章主要介紹了Android DragVideo實現(xiàn)播放視頻時任意拖拽的方法的相關(guān)資料,一種在播放視頻時,能夠拖拽的方案,需要的朋友可以參考下2016-12-12Android 登錄頁面的實現(xiàn)代碼(密碼顯示隱藏、EditText 圖標切換、限制輸入長度)
這篇文章主要介紹了Android 登錄頁面的實現(xiàn)代碼(密碼顯示隱藏、EditText 圖標切換、限制輸入長度),本文通過兩種方法給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08