一、问题场景
一般在使用下面几种使用场景情况下,传递参数为中文时,接收得到的值都有可能乱码,具体如下:
1.直接在浏览器使用url地址访问
2.页面提交form表单时,method设置为GET
3.使用ajax获取数据时,mehtod设置为GET
4.在程序中使用jvm提供URL资源定位实现方式(java.net.URL)
..
二、问题重现
1.默认情况描述
Tomcat服务器(默认“8080”端口),URL参数地址编码默认为ISO-8859-1(相当于“URIEncoding="ISO-8859-1")
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" />
post.jsp接收请求响应页面,且内容显示编码设置为“utf-8”(如下面图1-1)
<% @b@ String name=request.getParameter("name");@b@ out.println(name);@b@ %>
图1-1
2.问题现象
通过浏览器地址访问,乱码重现,如下图2-1所示:
图2-1
三、解决方法
方法一
修改Tomcat根目录conf路径下server.xml配置文件 - 添加URLEncoding="UTF-8"(对应上面图1-1设置文件编码格式)项,具体如下:
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" @b@ URIEncoding="UTF-8" />
结果如下图2-2所示
图2-2
方法二
修改接受文件post.jsp代码,将使用Tomcat默认URLEncoding为“ISO-8859-1”再转回对应的“UTF-8”(根据上图1-1中文件本身设置的对应的编码格式修改)
<% @b@ String name=request.getParameter("name");@b@ out.println(new String(name.getBytes("ISO-8859-1"),"UTF-8"));@b@ %>
结果中文也能恢复正常显示了
在发送中文参数编码前现在javascript中用encodeURI将被十六进制的转义序列(如结果为"%e5%80%aa%e4%bf%8a"),需要转换两次,如下代码示例所示
encodeURI(encodeURI("倪俊"));//对应解密decodeURI("%e5%80%aa%e4%bf%8a");
对于的后台jvm提供的对应的解码类(java.net.URLDecoder)进行解码,同样解码两次,示例如下
String name=request.getParameter("name");@b@ name=URLDecoder.decode(URLDecoder.decode(name),"utf-8");//对应加密URLEncoder.encode(name, "utf-8");