彻底解决get显示提交时,参数中包含中文时出现乱码的问题

本文介绍了在Tomcat服务器上解决中文乱码问题的方法,包括使用过滤器、修改server.xml配置以及字符编码转换等手段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      最近做了一个项目,由于工作需要,经常要把这个项目移动到不同的服务器上。因此引发了的我的项目在关键字搜索的时候经常出现乱码情况。每次都明明改正成功了,可以一换服务器又有乱码了。每次都是从表面上解决该问题,感觉很不方便,今天特意多方查阅资料。终于了解了问题的根本原因,因此拿出来与大家分享一下。

 

      其实问题的根本出现在Tomcat上面。

 

      开始我在JSP页面设置了<%@ page language="java" pageEncoding="utf-8"%>(设置文件的编码格式)
                                   <%@ page contentType="text/html;charset=utf-8" %>(设置文件的解码格式)

                                   <meta http-equiv="Content-Type" content="text/html" charset="utf-8">这三个编码

      我还在被提交到的Servlet中设置了request.setCharacterEncoding("utf-8")

                                                     response.setCharacterEncoding("utf-8")

      并且我在超链接提交参数的时候,用encodeURI函数对整个超链接进行了加密:encodeURI("search?title="+title),传到后台的如果在Servlet中设置了request.setCharacterEncoding("utf-8")和response.setCharacterEncoding("utf-8")的话,则不用对该参数进行解密,可直接获取该值request.getParamter("title")。 若没有写以上两句话,则必须对该参数的值进行解码,具体办法可用java.net.URLDecoder.decode("要进行解码的参数", "以什么方式解码");我第二个参数用的utf-8。

     

      以上的方式基本上能解决很多转码问题,大家可以试试以上方式解决自己的乱码问题。但我今天遇到的问题依旧无法解决乱码问题,我采取了另外的方式----------中文过滤器。以下是过滤器的写法:

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 *
 * @author L.Y.F
 */
public class ChineseFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        chain.doFilter(request, response);
    }

    public void destroy() {
    }

}

先创建一个过滤器的类,然后配置web.xml文件:

<filter>
        <filter-name>ChineseFilter</filter-name>
        <filter-class>com.mars.servlets.ChineseFilter</filter-class>
</filter>
<filter-mapping>
        <filter-name>ChineseFilter</filter-name>
        <!-- 该处的/*意味着过滤整个工程中的所有请求和相应信息,如果要过滤指定的网页,该处就设置指定的网页所在路径即可 -->
        <url-pattern>/*</url-pattern>                   
</filter-mapping>

该段代码要放在web.xml文件中的<web-app>节点下面。好了  过滤器设置完毕 ,过滤器的实现很简单吧。有人说,有了过滤器,再也不用担心乱码问题了,还有人说过滤器是万能的。可我现在的问题,连过滤器都没有解决.......

 

 

      于是我把过滤器去掉,重新回到手动转码的道路上来。我在网上了解到,这根Tomcat的默认编码有关系,Tomcat的默认编码为ISO-8859-1,大家都知道,这个编码集是不支持中文的,所以导致了中文乱码问题,于是我最初的想法是,既然知道了问题出在哪,又知道Tomcat的默认编码是什么,那么就用另一种方式看看能否解决该问题。 

      String str = new String("接受到的参数".getBytes("ISO-8859-1"),"utf-8");这次果然解决了乱码的问题,中文终于出现了。问题解决,非常高兴。可后来一想,万一当前Tomcat的编码要不是ISO-8859-1,那岂不是我的N多的Servlet中的代码全部要改?(就是把getBytes("ISO-8859-1")方法中的编码方式换成当前Tomcat的编码方式)。

  

      最主要的原因在与 tomcat4 和 tomcat5 中对参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的
      在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置URIEncoding 用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。 

      也就是说,我们通过 get 方法提交的参数实际上都是通过 uri 提交的,都由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。
      useBodyEncodingForURI 使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过 前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。
      将 useBodyEncodingForURI 设定为真后,就可以通过 request.setCharacterEncoding 直接解决 get 和 post 中的乱码问题。
这样,我们可以通过在 server.xml 中设定 URIEncoding 来解决 get 方法中的参数问题,使用过滤器来解决 post 方法中的问题。
或者也可以通过在 server.xml 中设定 useBodyEncodingForURI 为 true ,配合过滤器来解决编码的问题。     

      于是,我便改变目的,去修改Tomcat的默认编码。在Tomcat目录下有个conf的文件夹,打开这个文件夹找到一个名为server.xml的文件。打开它,找到<Connector>节点,在它的属性中添加  URIEncoding="utf-8"  这个属性即可。这样Tomcat的默认编码就变成了utf-8。  省去了又设置过滤器,又设置各种转码的种种麻烦。     至此,彻底解决了get这种显示请求包含中文乱码的问题。

      即使我修改的Tomcat的默认编码,在超链接提交的时候,依然要用encodeURI()函数对提交的超链接进行加密,如果不加密提交的话,参数中有2个中文汉字没有问题,但是当参数中出现3个中文汉字的时候,第三个字依然是乱码,这个原因我还不太清楚,是不是跟Get请求的长度限制有关系呢。我猜想。  反正是用那个函数进行加密提交就没有问题了。

      还有一个小问题,第一次修改完的时候很奇怪,就是明明已经修改了Tomcat的默认编码为utf-8,但是依然有错误 ,

还要用  String str = new String("接受到的参数".getBytes("utf-8"),"utf-8");  特殊转换一下,这个很让我诧异。虽然问题解决,但是这个地方依然不是很清楚。有高手麻烦解释一下原理。    当我把整个工程重新清理,然后生成之后,就不用这么特殊转换一下了,之后就再也没有出现过一定要在特殊转换一下才好使的情况。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值