Http网络传递参数中文乱码问题
周sir |
2015年8月6日 |
网络通讯 |
0 条评论 | 2834
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网络传递参数中文乱码问题
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。