中文乱码出现的原因是由于原因主要有两个:一个是字符转储传输过程中编码不一致导致的,一个是编码本就不支持中文。

支持中文的编码有(国标GB):GBK,GB2312,GBK18030,和UTF-8。(个人更喜欢使用UTF-8)

 

javaWeb中乱码情况主要分三种情况:

一、jsp页面显示中文乱码。保存中文字符 重新打开乱码。

二、客户端发送数据到服务器,服务器接收出现乱码。客户端发送数据又分为使用get请求和post请求两种。

三、服务器发送数据到客户端,客户端显示出现乱码的情况。

解决办法:

一、(1)jsp页面显示中文乱码。

//页面开始添加
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
//head中添加
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

        *pageEncoding用于设置JSP页面本身的编码 

        (2)文件保存中文字符 重新打开乱码。

         如果是myeclipse(其他IDE类似)

        Windows -> preference -> general -> Content Types ->Text  选择你需要显示中文的文件类型,将文件保存的默认编码设置为UTF-8。

二、客户端发送数据到服务器,服务器接收出现乱码。客户端发送数据又分为使用get请求和post请求两种。

   (1)get请求使用URL传参,浏览器对于请求的字符串一般使用utf-8。但是发送到服务器端,tomcat默认使用ISO-8859-1来解码,于是接收的时候乱码就产生了。

解决办法有两个:一、在服务器接收的时候手动解码,在doGet()方法中。

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

URIEncoding="UTF-8"。

<Connector part="8080" protocal="HTTP/1.1"
connectionTimeout="8000" redirectPort"8443" URIEncoding="UTF-8"/>

   (2)post请求乱码

解决办法也是两个:一、和get方法一样手动解码

String name=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");

                                二、在doPost方法里面设置全局编码,在第一行添加

request.setCharactorEncoding("UTF-8")

      (3)对于两种请求,单独解码或者配置都比较麻烦。我们可以采用在web.xml添加过滤器的方式

            使用过滤器要在web.xml中添加过滤器,如果你有使用到struts2或者spring框架,他们提供了这样的一个过滤器类,你只需要添加到配置文件就可以使用。如果都没有用到可以自定义过滤器类,后面有提到。

如果使用到spring框架:在web.xml中添加

<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
 </filter>
 <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
 </filter-mapping>

如果使用了struts2框架:在web.xml中添加

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

两者二选其一就行。如果没有使用框架,则需要自己实现过滤器类。

例如我的包名:com.example.user。在user文件夹下面建一个MyFilter类: 

public class MyFilter implements Filter {

    private String character; // 字符集编码类型

    /**
     * Filter的初始化
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        character = filterConfig.getInitParameter("character");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        // 读取初始化的参数character
        servletRequest.setCharacterEncoding(character);
        servletResponse.setCharacterEncoding(character);
        servletResponse.setContentType("text/html; charset=UTF-8");
        filterChain.doFilter(servletRequest, servletResponse); 
    }

    @Override
    public void destroy() {
    }
}

再在web.xml中将刚刚自定义的过滤器类添加进来:

<filter>     
        <!-- Filter的名字 -->
       <filter-name>MyFilter</filter-name>   
        <!-- Filter的实现类 -->
       <filter-class>com.example.user.MyFilter</filter-class>  
        <!-- 初始化参数 -->
       <init-param>     
            <param-name>characterEncoding</param-name>   
            <param-value>UTF-8</param-value>   
       </init-param>   
</filter>    
<!-- 定义Filter要拦截的url地址 -->
<filter-mapping>   
        <!-- Filter的名字 -->
       <filter-name> MyFilter </filter-name>  
        <!-- 要拦截的url,这里是所有拦截 -->
       <url-pattern>/*</url-pattern>  
</filter-mapping>

三、服务器发送数据到前端显示乱码

输出前设置内容编码格式

response.SetCharceterEncoding("utf-8");

response.getWriter().write("张三");