首页

解决URL传递中文时出现乱码问题(三种解决方法)

标签:中文乱码,URLEncoding,URLDecoder,encodeURI     发布时间:2015-07-08   

一、问题场景

一般在使用下面几种使用场景情况下,传递参数为中文时,接收得到的值都有可能乱码,具体如下:

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@ %>

解决URL传递中文时出现乱码问题(三种解决方法)

图1-1

2.问题现象

通过浏览器地址访问,乱码重现,如下图2-1所示:

解决URL传递中文时出现乱码问题(三种解决方法)

图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所示

解决URL传递中文时出现乱码问题(三种解决方法)

图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");