-
运行环境:
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程序里显示乱码等情况。
如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。
二、解决方法:
在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>