• 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>
     
  • 相关阅读:
    七easy网络陷阱上当
    移动端--web开展
    ContentType是否大小写区分?
    NYOJ 24 素数的距离问题
    Emoji:搜索将与您找到表情符号背后的故事
    Cocos2d-X之LUA注意事项
    [Angular] ChangeDetection -- onPush
    [Node.js] Build microservices in Node.js with micro
    [Angular] Scrolling the Message List To the Bottom Automatically Using OnChanges
    [Angular] Ngrx/effects, Action trigger another action
  • 原文地址:https://www.cnblogs.com/CjtBlog/p/13650608.html
Copyright © 2020-2023  润新知