zoukankan      html  css  js  c++  java
  • Javaweb项目中文乱码总结

      在项目开发中,经常会遇见中文字符串乱码出现,比如:从前台传到后台出现乱码,从后台存入数据库出现乱码,从后台到页面展示出现乱码。为了以后避免遇到类似问题,我们有必要对字符串从页面到数据,从数据库到页面,字符串会经过哪些编码关卡做个整理。

      1.从页面到后台出现中文乱码

      从页面提交数据到后台,会存在两种提交方式——get和post。针对这两种提交方式,会有不同的编码处理过程。

      get请求,经过Tomcat默认编码(tomcat8之前默认编码是ISO-8859-1,tomcat8之后改为UTF-8)进行前台数据编码,因为tomcat版本不同,我们做的操作也不一样,那么我们先说说tomcat8版本之前的做法,首先,我们在tomcat安装目录下找到sever.xml文件,同时在该文件中找到<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />代码,在该代码中添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。修改后的代码:

    <Connector port="8080"  protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" />

      post请求,request.getParamter()获取页面数据时,默认以ISO8859-1编码,针对这种情况,为了解决所有页面编码问题,我们可以写EncodingFilter进行request请求拦截,同时对所有接收的数据进行统一编码设置。关于该Filter的写法,不是此处详解,大家可以自行百度。

      2.从后台到数据出现中文乱码

      通常出现这种情况,多数是由于数据库的问题,因为前台传回来的数据通过上个步骤已经没问题,只要不做特殊处理,就不会出现中文乱码问题,但也有特殊情况,比如我最近遇见的,poi导入excel文件,后台接收时,遍历每行每列数据返回Object类型,需要用String强转存入数据库中,而问题就出现在这里,String存储数据时,如果不指定编码格式,会采用当前系统默认编码方式,据我查阅,windows平台的默认编码方式:gb2312,linux平台默认编码方式:utf-8。怎么去查询两个平台的默认编码。

      windows下,我们可以写个demo,代码如下:

    public static void main(String[] args) {
            Properties p = System.getProperties();
            System.out.println(p.getProperty("file.encoding"));
        }

      linux下,通过命令:locale

      

      针对windows平台处理方式:

     new String(((String) Obejct).getBytes(),"utf-8");

      这步没问题了,剩下数据库了。在这一步我就遇见了大麻烦,出现的问题:在本地上传excel到数据库(mysql)没问题,而上传linux云服务器上(数据库也是msyql)就出现了乱码,经查阅资料,解决方法如下:

      a.查询linux服务器上mysql的数据库默认编码,代码如下:

    show variables like 'character%';

      效果如下:

      b.修改my.cnf文件,代码如下:

    vim /etc/my.cnf
    

     效果如下:

      在红色框标识的代码下,添加如下代码:

    [client]
    default_character_set=utf8
    [mysqld]
    collation_server = utf8_general_ci
    character_set_server = utf8
    

      重启mysql服务器(linux服务器版本:Centos 7),代码如下:

    systemctl restart mysql.service
    

      如果遇见一直没有反应,则先关闭在启动达到重启效果,代码如下:

    systemctl stop mysql.service  //关闭服务器
    systemctl start mysql.service //启动服务器
    

      3.从后台到页面出现乱码

      可以在1步骤中的EncodingFilter中添加代码对response编码,示例代码如下:

    response.setContentType("text/html;charset=utf-8");

     

  • 相关阅读:
    分别针对Customers表与Order表的通用查询操作
    类的继承
    kubernetes service 原理解析
    k8s生命周期-钩子函数
    深入理解Pod-初始化容器
    为 Pod 或容器配置安全性上下文
    Docker四种网络模式
    python中__new__方法详解及使用
    浅析python析构函数
    k8s中的网络
  • 原文地址:https://www.cnblogs.com/yixtx/p/8426131.html
Copyright © 2011-2022 走看看