Java EKT关键技术强化 tomcat中文乱码问题

  • 运行环境:

  JDK8 + IntelliJ IDEA 2018.3 


 

 一、Java中文问题的由来:

  Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。

   首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成class文件 过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系), 如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上<%@ page contentType="text/html;charset=GBK"%>或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。

  本文要重点讨 论的是第二类乱码,即Java程序与其他存储媒介交互时产生的乱码。很多存储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java程序与这些 媒介交互时就会发生字符(char)与字节(byte)之间的转换,例如从页面提交表单中提交的数据在Java程序里显示乱码等情况。

  如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。

二、解决方法:

1.方案一:

第一步:

在idea的目录中找:

第二步:

在idea64.exe.vmoptions中添加一句话:

保存关闭

第三步:

关闭idea再重新启动

第四步:

在往tomcat中部署项目时在VM options中添加 -Dfile.encoding=UTF-8

这样中文乱码就可以解决了。

2.方案二:

1、更改Tomcat安装目录下的confserver.xml,指定浏览器的编码格式为“utf-8”格式:
  方法是更改 server.xml 中的

    <Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
    enableLookups="false" redirectPort="8443" acceptCount="100"
    connectionTimeout="20000" disableUploadTimeout="true" URIEncoding='utf-8' />

 注意设置URIEncoding='utf-8'

2、设置servlet过滤器

       方法是在项目的web.xml文件中加入以下filter

  <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>net.servlet.CharacterEncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
代码如下:
package net.servlet;

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;

public class CharacterEncodingFilter  implements Filter  {

    private static String encoding = "utf-8";   
    private boolean ignore=true;  
    
    protected String getEncoding(){   
        return this.encoding;   
    }   
    
    @Override
    public void destroy() {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        String pencoding="utf-8";
        if(ignore||null==request.getCharacterEncoding()){               
            if(pencoding!=null){   
                request.setCharacterEncoding(pencoding);   
            }   
        }   
//      System.out.println("encoding===="+encoding);   
        response.setContentType("text/html;charset="+pencoding);   
//      do something here   
        //当前工作全部完成后,将请求放开给过滤器链的下一filter    
        chain.doFilter(request, response);   
        
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
          this.encoding=filterConfig.getInitParameter("encoding");   
            String value=filterConfig.getInitParameter("ignore");   
            if(value==null){   
                this.ignore=true;   
            }else if(value.equalsIgnoreCase("true")){   
                this.ignore=true;   
            }else if(value.equalsIgnoreCase("yes")){   
                this.ignore=true;   
            }else{   
                this.ignore=false;   
            }   
    }
}
3、如果以上两个步骤还没有解决乱码问题,那就有可能是数据库本身的问题。应当将数据库的编码方式统一设置为utf-8<DataSources>
        <ds name="MyPrintPhoto">
            <username>root</username>
            <password>123456</password>
            <dburl>jdbc:mysql://localhost:3306/myprintphoto?useUnicode=true&characterEncoding=utf8&useOldAliasMetadataBehavior=true
            </dburl>
            <classname>com.mysql.jdbc.Driver</classname>
        </ds>
</DataSources>
 
原文地址:https://www.cnblogs.com/CjtBlog/p/13650608.html