Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 404|回复: 0

[jsp学习]Mysql与JSP网页中文乱码问题的解决方案

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-1 11:11:04 | 显示全部楼层 |阅读模式
    自从以前学习JSP开始,中文乱码问题就一直不断,苦不堪言。这次在项目开始之前,我们要解决的第一个问题就是把mysql的中文乱码问题搞定。经过多天的努力,终于成功的解决了中文乱码问题,特写在这里,以备后用。

        软件及环境:Windows XP(2000), j2sdk1.4.2, Tomcat 5.0.25, mysql 4.1, EMS Mysql Manager 2(方便建表,版本2.8.5.1),驱动为mysql-connector-java-3.1.4-beta-bin.jar。

    目标:在该环境下,实现中文的正常显示,读取与插入数据库

    注:我只在此环境下测试通过,别的系统及不同版本未测试

    要点:统一字符集(JSP页面编码,mysql建库时字符集选择,连接数据库URL,request设定等)

    下面我以GBK为例讲解。如果要使用utf-8,只要在相应的GBK处换成utf-8即可
      
      
       
       
       

       
      
    ?
      
    --------------------------- 步骤1 以GBK字符集建库建表 -------------------------------------

         我使用EMS来建mysql的数据库及表,因为它是图形界面,方便操作(就像SQL SERVER 2000中的企业管理器一样)。

         建库时,从EMS菜单中选create Database...新建一个数据库,CharacterSet选gbk_bin(另一个gbk_chinese_ci不知道与这个有什么区别,我找资料也没有找到。如果你知道,请告诉我,我补充在这里)。不要把工具栏上有一个加号和数据库模样的图标当成新建数据库了,那个新注册一个已经存在的数据库。
    后面建表时,也要选择同样的字符集。

    建好后,此时不要用EMS向里面插入数据,否则你看到的中文依然是乱码。

    --------------------------- 步骤2 连接数据库的URL后加些参数 -------------------------------

    假设我新建的数据库是testdb,那么我连接数据库的url应该为:

    jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk

    此时要注意:如果我是把这个url写在JAVA代码中,就直接这样写。但如果是在xml配置文件中(如struts-config.xml,web.xml等),要把其中的&改为&才行,否则会出错。也就是:

    jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=gbk

    --------------------------- 步骤3 每个JSP页面都要声明该中文字符集 ----------------------------

    在每个JSP页面的最上面都加上一句

    <%@ page language="java" contentType="text/HTML;charset=GBK" %>

    这样才能保证JSP页面中的中文显示正常

    --------------------------- 步骤4 加一个传递参数时设定request字符集的filter类 -----------------------

           因为网络中字符在传递的时候,都是统一以iso-8859-1的编码传递,所以我们必须对request重新设定字符集,才能正常显示中文。如果采用filter类来实现,我们不用在每次取中文参数时都要重新设定。

    filter类的内容:

    /*
    * ====================================================================
    *
    * JavaWebStudio 开源项目
    *
    * Struts_db v0.1
    *
    * ====================================================================
    */
    package com.strutsLogin.util;

    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 SetCharacterEncodingFilter implements Filter {

    protected String encoding = null;


    protected FilterConfig filterConfig = null;


    protected boolean ignore = true;


    public void destroy() {

    this.encoding = null;
    this.filterConfig = null;

    }


    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws IOException, ServletException {

    if (ignore || (request.getCharacterEncoding() == null)) {
        String encoding = selectEncoding(request);
        if (encoding != null)
          request.setCharacterEncoding(encoding);
    }

    // Pass control on to the next filter
    chain.doFilter(request, response);

    }


    public void init(FilterConfig filterConfig) throws ServletException {

    this.filterConfig = filterConfig;
    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;

    }


    protected String selectEncoding(ServletRequest request) {

    return (this.encoding);

    }

    }//EOC


    该代码来自于www.javawebstudio.com,特此感谢!

    然后我们在web.xml中加一些配置,就可以了,配置如下:

    <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>javawebstudio.struts_db.SetCharacterEncodingFilter</filter-class>
    <init-param>
       <param-name>encoding</param-name>
       <param-value>GBK</param-value>
    </init-param>
    <init-param>
       <param-name>ignore</param-name>
       <param-value>true</param-value>
    </init-param>
    </filter>

    <filter-mapping>
       <filter-name>Set Character Encoding</filter-name>
       <servlet-name>action</servlet-name>
    </filter-mapping>

    放在web.xml的合适位置。一般在最后,<jsp-config>标签之前(如果有的话)

    经过以上步骤,JSP和mysql的中文显示及插入就都正常了。在STRUTS中也正常。

    但是,此时如果你用EMS或mysql的命令行控制台来看表中的数据,却发现它们都是????。这是怎么回事呢?

    不用担心,只要我们运行下面的这几行命令,就能看到正常的中文了!

    SET character_set_client = gbk;
    SET character_set_connection = gbk;
    SET character_set_database = gbk;
    SET character_set_results = gbk;
    SET character_set_server = gbk;

    SET collation_connection = gbk_bin;
    SET collation_database = gbk_bin;
    SET collation_server = gbk_bin;

    如果你用的是mysql的命令行,则直接输入就好。

    如果是EMS,则在工具栏中有一个Show SQL Editor按钮,点一下,把上面的命令输入,再按一个"execute"的按钮,就行了!

    而且在这种情况下,你可以甚至可以用中文名来建数据库,表名和字段名!!!!

    ----------------------------------------------------------------------------------------------------

    但是有一点要特别注意!

    像GBK,UTF-8这样的名字,在mysql与JAVA中有不同的规定,写的时候要格外注意,否则会出错。

    比如GBK,在JAVA中要写成GBK,但在mysql中要写成gbk(连接数据库的URL)

    比如UTF-8,在JAVA中要写成UTF-8,但在Mysql中要写成utf8

    其它的字集符也有类似的区别
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-3 22:09 , Processed in 0.386241 second(s), 50 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表