<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    自從以前學習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設定等)
    -------我自己的
    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES 'gbk' */;

    #drop database named teckoparts

    drop database if exists teckoparts;

    #create database named teckoparts

    create database teckoparts;

    #use database teckoparts

    use teckoparts;

    #create table catalog
    create table catalog
    (
    ?id varchar(255) not null primary key,
    ?parentId varchar(128) not null,
    ?text_en? varchar(256) not null,
    ?text_hk? varchar(256) ,
    ?text_ch? varchar(256),
    ?info???? varchar(1024)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    insert into catalog values('1','0','teckoparts','達藝零件','達藝零件','總目錄');

    #create?table admin
    create table admin
    (
    ?id int(11) not null primary key,
    ?userName? varchar(128) not null,
    ?passWord? varchar(12)? not null,
    ?role?? char(1)
    ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

    insert into admin values(1,'admin','admin','1');

    /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
    /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
    /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

    下面我以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等),要把其中的&改為&amp;才行,否則會出錯。也就是:

    jdbc:mysql://localhost:3306/testdb?useUnicode=true&amp;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 {

    // ----------------------------------------------------- Instance Variables

    /**
    * The default character encoding to set for requests that pass through
    * this filter.
    */
    protected String encoding = null;

    /**
    * The filter configuration object we are associated with. If this value
    * is null, this filter instance is not currently configured.
    */
    protected FilterConfig filterConfig = null;

    /**
    * Should a character encoding specified by the client be ignored?
    */
    protected boolean ignore = true;

    // --------------------------------------------------------- Public Methods

    /**
    * Take this filter out of service.
    */
    public void destroy() {

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

    }

    /**
    * Select and set (if specified) the character encoding to be used to
    * interpret request parameters for this request.
    *
    * @param request The servlet request we are processing
    * @param result The servlet response we are creating
    * @param chain The filter chain we are processing
    *
    * @exception IOException if an input/output error occurs
    * @exception ServletException if a servlet error occurs
    */
    public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)
    throws IOException, ServletException {

    // Conditionally select and set the character encoding to be used
    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);

    }

    /**
    * Place this filter into service.
    *
    * @param filterConfig The filter configuration object
    */
    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 Methods

    /**
    * Select an appropriate character encoding to be used, based on the
    * characteristics of the current request and/or filter initialization
    * parameters. If no character encoding should be set, return
    * <code>null</code>.
    * <p>
    * The default implementation unconditionally returns the value configured
    * by the <strong>encoding</strong> initialization parameter for this
    * filter.
    *
    * @param request The servlet request we are processing
    */
    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

    其它的字集符也有類似的區別

    主站蜘蛛池模板: 免费毛片a在线观看67194| 国产成人精品日本亚洲专一区| 国产桃色在线成免费视频| 久久一区二区三区免费| 久久亚洲精品无码网站| 亚洲精品福利在线观看| 亚洲AV无码精品色午夜在线观看| 国产区卡一卡二卡三乱码免费| 国产电影午夜成年免费视频| 日本在线看片免费| 一级做a爰全过程免费视频毛片 | 亚洲国产免费综合| 亚洲av午夜电影在线观看| 亚洲免费闲人蜜桃| 亚洲一区综合在线播放| 久久被窝电影亚洲爽爽爽| 4338×亚洲全国最大色成网站| 国产中文字幕免费| 国产片免费在线观看| 女人18毛片特级一级免费视频| 国国内清清草原免费视频99| 最近中文字幕免费完整| 亚洲精品成人a在线观看| 在线观看国产情趣免费视频| 日韩激情无码免费毛片| 天堂在线免费观看中文版| 国产99视频精品免费观看7| 国产精品1024永久免费视频| 91香蕉在线观看免费高清| 91精品国产免费入口| 99在线在线视频免费视频观看 | 免费观看一级毛片| 中文字幕无码免费久久9一区9| 免费国产草莓视频在线观看黄| 久久亚洲日韩看片无码| 中文字幕在线观看亚洲| 亚洲精品中文字幕麻豆| 亚洲在成人网在线看| 亚洲国产日韩精品| 国产精品久久久久久亚洲影视| 亚洲国产成人久久综合|