乱码问题
原因:
tomcat默认的在url传输时是用iso8859-1编码。
解决方案一:
在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来传输,使用这种方式就是把中文转换成以%开头的编码在url中传输。
使用这种方法时,要注意两点。
1.前台使用urlencode,在后台相应的使用urldecode。
2.使用urlencode的内容是参数内空。千万要注意,他是会把等于号等符号也给转换了。所以,最好是先把参数传换后再进行拼接。而不是把url拼接好再去转换。
解决方案二:
配置tomcat,使用其在url传输过程中使用相应的支持中文的编码。一般国内的喜欢用gbk或gb2312。我个人建议使用utf-8
在tomcat的/conf/server.xml文件中,找到以下这一行。
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
这行的意思也就是使用8080端口来接收html的请求。在这里可以加几个参数来配置不同的效果。
URIEncoding="UTF-8" 设置url传输时对url内容的编码格式
compression="on" 打开压缩功能
compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB
noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩
compressableMimeType="text/html,text/xml" 压缩类型
对于要解决乱码来说,改成以下就行
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />
转:
经过分析,使我对TOMCAT的处理机制和HttpServletRequest有了更加深入的认识。
1.filter过滤器中获取参数值出现乱码
下面是服务器端中的过滤器获取参数的代码:
Java代码
- public void doFilter(ServletRequest arg0, ServletResponse arg1,
- FilterChain arg2) throws IOException, ServletException {
- String foo=arg0.getParameter("foo");
- System.out.println(foo);
- arg2.doFilter(arg0, arg1);
- }
当我在浏览器输入“http//:localhost:8080/rest/test?foo=中国”时,浏览器会自动对"中国"进行URI转码,由于使 用的中文语言环境,浏览器会将“中国”转码为"%D6%D0%B9%FA"."D6D0","B9FA"分别"中","国"的GBK编码。等价于在 JAVA语言中作了如下操作
Java代码
- URLEncoder.encode("中国","GBK")
传递到服务器后的URL实际为“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。
由于TOMCAT默认会对URL进行解码,并且使用的是ISO-8859-1字符集,如下所示
Java代码
- URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");
因为编码和解码使用的是不同的字符集,所以解码出来的字符串肯定是不对的,故而使用如下方式获取参数值时出现乱码。
Java代码
- String foo=request.getParameter("foo");
2.resteasy的service方法中获取参数出现乱码
Java代码
- @GET
- @Path("/test")
- public void hello10(@QueryParam(value="foo") String foo) {
- System.out.println(foo);
- }
resteasy中获取到request参数foo的机制与前面的filter略有不同。foo参数的是值由resteasy框架进行类似如下处理后获得的。
Java代码
- String params=request.getQueryString();
- System.out.println(params);//foo=%D6%D0%B9%FA
- String encodedParams= URLDecoder.decode(params,"UTF-8");
- ......
通过getQueryString()方式获得的参数并没有被TOMCAT解码过,但被resteasy框架进行了解码,当传入参数不是以UTF-8编码的话获取到的参数就可能是乱码
3.总结
使用request.getParameter方式获得的参数是已经经过web服务器解码的
使用request.getQueryString可以获得未解码的原始参数
对于tomcat解码造成的乱码问题可以通过2种途径解决
修改tomcat配置文件设置解码方式
服务器端对于获取到的参数进行new String(param.getBytes("ISO-8859-1"),"页面指定编码")转换