Http网络传递参数中文乱码问题

    |     2015年8月6日   |   网络通讯   |     0 条评论   |    2835

Http 传中文参数乱码,多半是客户端和服务端编码不一致。做法很简单:两端统一成 UTF-8。Tomcat 默认是 ISO-8859-1,不支持中文,不处理就一定乱码。


一、服务端:转码或改 Tomcat

先统一客户端和服务端编解码为 UTF-8。若请求已经按 ISO-8859-1 读进来,可在业务里转一次:

String userName = new String(userName.getBytes("ISO-8859-1"), "UTF-8");

更干净的做法是改 Tomcat 的 server.xml,给 Connector 加上 URIEncoding="UTF-8":

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           URIEncoding="UTF-8" />

二、Android 客户端:GET 与 POST

GET:先对 URL 里的中文做 UTF-8 编码。

String name = URLEncoder.encode("中国万岁", "UTF-8");

POST:参数同样按 UTF-8 编码。关键两句:构造 UrlEncodedFormEntity 时传入 HTTP.UTF_8;Header 声明 charset=utf-8。若 Servlet 里已 request.setCharacterEncoding("UTF-8"),第二行 Header 可以不设。

BasicNameValuePair userNamePair = new BasicNameValuePair("userName", "李四");
BasicNameValuePair passWordPair = new BasicNameValuePair("passWord", "321");
ArrayList<BasicNameValuePair> parameters = new ArrayList<BasicNameValuePair>();
parameters.add(userNamePair);
parameters.add(passWordPair);
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(parameters, HTTP.UTF_8);
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
位置 做什么
Tomcat 默认 ISO-8859-1;加 URIEncoding=UTF-8,或 getBytes 转码
GET URLEncoder.encode(中文, “UTF-8”)
POST UrlEncodedFormEntity(…, HTTP.UTF_8) + Content-Type charset
Servlet request.setCharacterEncoding(“UTF-8”) 后可省略 POST Header

一句话总结:乱码就是编码不一致;客户端 URLEncoder / UrlEncodedFormEntity 用 UTF-8,服务端 Tomcat 也改成 UTF-8。

转载请注明来源:Http网络传递参数中文乱码问题
本文链接地址:https://ai.zhousir.top/?p=933

上一篇:

下一篇:

回复 取消