Tomcat get 中文乱码

乱码问题

缘由:

tomcat默认的在url传输时是用iso8859-1编码。html

 

解决方案一:

在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来传输,使用这种方式就是把中文转换成以%开头的编码在url中传输。web

使用这种方法时,要注意两点。浏览器

1.前台使用urlencode,在后台相应的使用urldecode。tomcat

2.使用urlencode的内容是参数内空。千万要注意,他是会把等于号等符号也给转换了。因此,最好是先把参数传换后再进行拼接。而不是把url拼接好再去转换。服务器

 

解决方案二:

配置tomcat,使用其在url传输过程当中使用相应的支持中文的编码。通常国内的喜欢用gbk或gb2312。我我的建议使用utf-8框架

在tomcat的/conf/server.xml文件中,找到如下这一行。编码

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />url

这行的意思也就是使用8080端口来接收html的请求。在这里能够加几个参数来配置不一样的效果。spa

 

URIEncoding="UTF-8" 设置url传输时对url内容的编码格式rest

 

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代码   收藏代码
  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语言中做了以下操做

Java代码   收藏代码
  1. URLEncoder.encode("中国","GBK")  

 

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

    因为TOMCAT默认会对URL进行解码,而且使用的是ISO-8859-1字符集,以下所示

Java代码   收藏代码
  1. URLDecoder.decode("%D6%D0%B9%FA","ISO-8859-1");  

 由于编码和解码使用的是不一样的字符集,因此解码出来的字符串确定是不对的,故而使用以下方式获取参数值时出现乱码。

Java代码   收藏代码
  1. String foo=request.getParameter("foo");  

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

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

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

 

Java代码   收藏代码
  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"),"页面指定编码")转换

相关文章
相关标签/搜索