Tomcat get 中文乱码

乱码问题

原因:

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过滤器中获取参数值出现乱码

下面是服务器端中的过滤器获取参数的代码:

  1. public void doFilter(ServletRequest arg0, ServletResponse arg1,
  2. FilterChain arg2) throws IOException, ServletException {
  3. String foo=arg0.getParameter("foo");
  4. System.out.println(foo);
  5. arg2.doFilter(arg0, arg1);
  6. }

当我在浏览器输入“http//:localhost:8080/rest/test?foo=中国”时,浏览器会自动对"中国"进行URI转码,由于使 用的中文语言环境,浏览器会将“中国”转码为"%D6%D0%B9%FA"."D6D0","B9FA"分别"中","国"的GBK编码。等价于在 JAVA语言中作了如下操作

  1. URLEncoder.encode("中国","GBK")

传递到服务器后的URL实际为“http//:localhost:8080/rest/test?foo=%D6%D0%B9%FA”。

由于TOMCAT默认会对URL进行解码,并且使用的是ISO-8859-1字符集,如下所示

  1. URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");

因为编码和解码使用的是不同的字符集,所以解码出来的字符串肯定是不对的,故而使用如下方式获取参数值时出现乱码。

  1. String foo=request.getParameter("foo");

 2.resteasy的service方法中获取参数出现乱码

  1. @GET
  2. @Path("/test")
  3. public void hello10(@QueryParam(value="foo") String foo) {
  4. System.out.println(foo);
  5. }

resteasy中获取到request参数foo的机制与前面的filter略有不同。foo参数的是值由resteasy框架进行类似如下处理后获得的。

  1. String params=request.getQueryString();
  2. System.out.println(params);//foo=%D6%D0%B9%FA
  3. String encodedParams= URLDecoder.decode(params,"UTF-8");
  4. ......

通过getQueryString()方式获得的参数并没有被TOMCAT解码过,但被resteasy框架进行了解码,当传入参数不是以UTF-8编码的话获取到的参数就可能是乱码

3.总结

使用request.getParameter方式获得的参数是已经经过web服务器解码的

使用request.getQueryString可以获得未解码的原始参数

对于tomcat解码造成的乱码问题可以通过2种途径解决

修改tomcat配置文件设置解码方式

服务器端对于获取到的参数进行new String(param.getBytes("ISO-8859-1"),"页面指定编码")转换

上一篇:Django入门-框架目录介绍


下一篇:如何使用Json-lib