android和服務(wù)器的URLEncodedUtils亂碼編碼問題的解決方案
在android開發(fā)中我們常常遇到與到亂碼問題,遇到亂碼問題首先我們要先檢查兩端編碼格式是否一致!
一般我們提交數(shù)據(jù)用get 和post方法,這兩種方法在上傳中有con.setRequestProperty("Charset", "UTF-8"); 和httppost.setEntity(new UrlEncodedFormEntity(數(shù)據(jù),"UTF-8"));這兩中方式來確定編碼方式服務(wù)器端有request.setCharacterEncoding("UTF-8");response.setCharacterEncoding("UTF-8");來確定響應(yīng)的編碼格式。這樣一般是不會(huì)出現(xiàn)亂碼,如果出現(xiàn)亂碼我們還可以建立一個(gè)過濾器來過濾亂碼,在這里我不講過濾器,改天再單獨(dú)說一下過濾器。
今天我想說的是關(guān)于在post傳遞參數(shù),在路徑后+?+參數(shù)傳遞方式,然后傳遞后的接受亂碼問題。
首先我們安卓端要封裝數(shù)據(jù)String str=URLEncodedUtils.format( 封裝好的Parameters數(shù)據(jù),"UTF-8"); 然后默認(rèn)utf-8編碼,然后HttpPath.FABU_PATH+"?"+str 把數(shù)據(jù)接在路徑下邊用post方式提交。在這里用了URLEncodedUtils將數(shù)據(jù)編碼了。
接下來說的是服務(wù)器接受問題。服務(wù)器接受數(shù)據(jù)后會(huì)進(jìn)行默認(rèn)的轉(zhuǎn)碼,Tomact的默認(rèn)轉(zhuǎn)碼格式是ISO_8859-1 所有我們要再次轉(zhuǎn)碼。需要兩次轉(zhuǎn)碼,下邊就是服務(wù)器轉(zhuǎn)碼代碼
String=new String(request.getParameter("runame").getBytes("ISO_8859-1"),"UTF-8");
那么用URLEncodedUtils編碼發(fā)送數(shù)據(jù)的一套代碼如下
安卓:String str=URLEncodedUtils.format( 封裝好的Parameters數(shù)據(jù),"UTF-8");
java服務(wù)器: String=new String(request.getParameter("runame").getBytes("ISO_8859-1"),"UTF-8");
runame是封裝好的數(shù)據(jù)中的一個(gè)字段;
下面是關(guān)于url解碼的一些東西:
第一種方式指定編碼UTF-8
傳遞頁面
URLEncoder.encode(name,"UTF-8")
獲取頁面
String name=new String(request.getPatameter(name).getBytes("ISO_8859-1"),"UTF-8");
或者傳遞頁面
URLEncoder.encode(name);
獲取頁面
String name=new String(request.getPatameter(name).getBytes("ISO_8859-1));
第二種方式是沒有指定編碼的,按平臺(tái)默認(rèn)的編碼。
不能寫成傳遞頁面
URLEncoder.encode(name,"UTF-8")
獲取頁面
String name=new String(request.getPatameter(name).getBytes("ISO_8859-1));
這樣的話有可能出現(xiàn)亂碼。因?yàn)槟悴恢榔脚_(tái)的編碼是什么。
所以只能按第一或者第二種形式,java推薦我們用第一種指定編碼“utf-8”
今天折騰了兩個(gè)小時(shí)就為了解決這個(gè)中文亂碼問題。
下面是解決代碼:
服務(wù)器端:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
response.setContentType("text/html");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("utf-8");
......(此處省去操作數(shù)據(jù)代碼)
}
客戶端:
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
不要理params,這個(gè)是發(fā)送給服務(wù)器的數(shù)據(jù)包。主要是HTTP.UTF_8
問題就解決了。不要搞GBK這個(gè)編碼,這個(gè)編碼會(huì)存在各種問題的。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Android組件間通信--深入理解Intent與IntentFilter
本篇文章是對(duì)Android組件間通信Intent與IntentFilter進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
源碼解析Android Jetpack組件之ViewModel的使用
Jetpack 是一個(gè)豐富的組件庫,它的組件庫按類別分為 4 類,分別是架構(gòu)(Architecture)、界面(UI)、 行為(behavior)和基礎(chǔ)(foundation)。本文將從源碼和大家講講Jetpack組件中ViewModel的使用2023-04-04
Android動(dòng)態(tài)添加設(shè)置布局與控件的方法
這篇文章主要介紹了Android動(dòng)態(tài)添加設(shè)置布局與控件的方法,涉及Android中布局與控件的相關(guān)操作技巧,需要的朋友可以參考下2016-01-01
Android入門之使用OKHttp組件訪問網(wǎng)絡(luò)資源
這篇文章主要為大家詳細(xì)介紹了Android如何使用OKHttp組件訪問網(wǎng)絡(luò)資源功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2022-12-12
Android編程實(shí)現(xiàn)圖片放大縮小功能ZoomControls控件用法實(shí)例
這篇文章主要介紹了Android編程實(shí)現(xiàn)圖片放大縮小功能ZoomControls控件用法,結(jié)合具體實(shí)例形式分析了Android ZoomControls控件實(shí)現(xiàn)圖片縮放的具體操作方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-09-09
仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換
這篇文章主要介紹了仿墨跡天氣在Android App中實(shí)現(xiàn)自定義zip皮膚更換的方法,即讓用戶可以自行通過自制或者下載的zip皮膚包進(jìn)行換膚,需要的朋友可以參考下2016-02-02
Android從Fragment跳轉(zhuǎn)到其他Activity的簡(jiǎn)單實(shí)例
這篇文章主要介紹了Android從Fragment跳轉(zhuǎn)到其他Activity的簡(jiǎn)單實(shí)例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02

