【转】JavaWeb编码之get方式中文乱码问题
一、现象描述
以get方式提交含中文表单,后台接收为乱码:
<form action="admin/User/searchUser.do" method="get">
<div class="input-group">
<input type="text" class="form-control" name="content" value="${content}" placeholder="Search for..." required>
<span class="input-group-btn">
<button class="btn btn-default" type="submit">搜索</button>
</span>
</div>
</form>
访问地址为:
后台输出为:
二、现象分析
URL 的组成部分如下:
请求的地址为:
从Request URL 可以看出 QueryString 编码是GBK。
以 GET 方式 HTTP 请求的 QueryString 和以 POST 方式 HTTP 请求的表单参数都是作为 Parameters 保存的,都通过 request.getParameter 获取参数值。
对它们的解码是在 request.getParameter 第一次被调用时进行的。
request.getParameter 方法被调用时将会调用 org.apache.catalina.connector.Request 的 parseParameters 方法。这个方法会对 GET 和 POST 方式传递的参数进行解码,但是他们解码的字符集可能不一样。
而QueryString编码采取的字符集要么是 Header 中 ContentType 定义的Charset,要么是默认的 ISO-8859-1 编码。
而此处 html 页面未设置 Content-Type,由此得出结论:中文经过GBK编码后,在服务端经过 ISO-8859-1解码,导致乱码。
三、解决方式
- 配置Tomcat的 server.xml 文件中的 connector 的 URIEncoding 和 useBodyEncodingForURI 属性(useBodyEncodingForURI = “true” 表示使用 ContentType 定义的编码,而且此处的 URI 仅仅是对 QueryString 使用 BodyEncoding 解码);
- 使用 new String(str.getBytes(“ISO-8859-1”), “UTF-8”) 解码;
验证如下:
方式1:
结果为:
使用 UTF-8 解码则中文正确传递。
方式2:
@RequestMapping(value = "/searchUser")
public String searchUser(String content) {
System.out.println("content: " + content);
try {
content = new String(content.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("content after decode: " + content);
}
结果为: