解決jsp,tomcat,MYSQL下中文亂碼問題

以下文章轉自互聯網,以備自查,若有版權請及時聯系我們刪除,謝謝!

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.FilterConfig;
public class SetCharacterEncodingFilter implements Filter {
    protected String encoding;
    protected FilterConfig filterConfig;
    protected boolean ignore;
    public SetCharacterEncodingFilter(){
            encoding=null;
            filterConfig=null;
            ignore=true;
    }
    public void destroy(){
        encoding=null;
        filterConfig=null;
    }

    //真實的設置Encoding的代碼
    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);
        }
        chain.doFilter(request, response);
    }

        //進入這個過濾器,首先執行的是init方法,此處代碼從web.xml中得到系統是否要setCharacterEncoding并且用哪種編碼
        public void init(FilterConfig filterConfig)throws ServletException{
            this.filterConfig=filterConfig;
            encoding=filterConfig.getInitParameter("encoding");
            String value=filterConfig.getInitParameter("ignore");
            if(value==null)    ignore=true;
            else if(value.equalsIgnoreCase("true")) ignore=true;
            else if(value.equalsIgnoreCase("yes")) ignore=true;
            else ignore=false;
        }
        protected String selectEncoding(ServletRequest request){
            return encoding;

}

}

把/root/apache-tomcat-5.5.23/webapps/servlets-examples/WEB-INF/classes/filters目錄下把
SetCharacterEncodingFilter.class導入工程的包中,例如我的為zhouzhiwei.survey.books
在工程目錄的WebRoot/WEB-INF/web.xml添加

        setCharEncoding
        cn.myWiki.tools.SetCharacterEncodingFilter
        
            encoding
            gb2312
        
        
            enable
            true
        
    
    
        setCharEncoding
        /*
    

以下內容有關Mysql的中文處理

    這段時間做的項目要用到Mysql。一說到Mysql ,中文問題就是初使用者的一個門檻!每個要錄入中文的功能、表都不可避免的問題.在這里就以我做的一個小型測試項目(日記管理系統)說起,開發工具myeclipse6.0, Dreamweaver8.0,數據庫Mysql 6.0 ,notepad編寫SQL,服務器:JBOSS4.0
    首先在建立WEB工程的時候要選好編碼,我們一般用UTF-8,因為UTF-8是國際標準編碼,集成的字符集比GBK 、GBK2312要多. 也有利于整個項目的擴展性。


     然后到每一個Servlet ,jsp 頁面都要將編碼設置成UTF-8,還有一個問題就是JBOSS 是會區分UTF-8的大小寫的所以最好就是用大寫,以免功虧一簣。

     JSP里面的設置:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    還有在META 里面也要設置

到了最關鍵的地方就是連接數據庫的語句.(在本工程里面用的是JDBC直連,可以去MYSQL官方網站下載驅動)
要在語句后面加兩個參數,代碼如下:
url = "jdbc:mysql://localhost/diarydb?useUnicode=true&characterEncoding=UTF-8";
注意在Hibernate中要改成這樣 把“&”符號改成 html標記 & 否則報錯

try {

    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(url,"user","pwd");
    stmt = con.createStatement();

   } catch (ClassNotFoundException e) {
    // TODO: handle exception
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
到這里為止整個工程的設置告一段落,后面緊跟著的就是建庫,建表的設置問題;
如果對MYSQL語句不熟,可以直接用客戶端工具(本人推薦navicat 不過是要錢D,這沒關系,破解版在中國是沒辦法找不到的) , 但我在這里就只演示一下代碼,如下:

drop database diarydb;
create database diarydb;
alter database diarydb character set utf8;         ----設置數據庫編碼;
use diarydb;
create table userinfotable
(
uid int primary key not null ,
uname varchar(20) ,
upwd varchar(20),
uclass int

)ENGINE=InnoDB DEFAULT CHARSET=utf8;       -----設置表的編碼;

好啦,經過以上一翻掘地三尺的設置,我們可愛的中文終于可以顯示在久違了的browser上了.各位使用MYSQL遇到中文問題的朋友們,希望我的這些資料能幫上你的忙……

mysql對中文的支持不是很好,對編碼的分類很細,可以細到某個數據庫里面的某個表的某個列用什么編碼。默認情況下用的是latin1,要顯示中文的話就要用utf8,一般創建數據庫都不會明確的寫用什么編碼,所以問題就出現了。解決辦法是把mysql安裝文件夾下面的my.ini里面所有的default-character-set=lartin1改為=utf8,然后重啟數據庫,并把原來建的數據庫重新建一次(因為改之前建的用了lartin1的編碼,如果不方便重建也可以選擇把它倒出來再導回去)。

以上是對于在Windows環境下Mysql的配置。如下是在linux環境下的配置:

中文存入mysql數據表出現的亂碼,從JSP頁面讀取mysql中文數據出現亂碼,以及在sell環境下查看數據庫表中文數據出現亂碼。

linux平臺:ubuntu6.10

mysql版本:5.0

瀏覽器:firefox2.0

為了解決中文亂碼的問題首先就是要同一字符集,我采用utf-8。

第一步:安裝mysql后,修改配置文件/etc/mysql/my.cnf 找到相應項并添加如下字段,如下所示:(注意是添加,配置文件中其他不相關的內容下面并沒有列出來)

[client]

default-character-set=utf8

[mysqld_safe]

default-character-set=utf8

[mysqld]

default-character-set=utf8

[mysql]

default-character-set=utf8

重新啟動mysql服務,進入sell終端,進入mysql的命令提示符下輸入如下指令:

mysql>show variables like '%char%';

如果出現的列表各項內容和以下相同表明配置成功了,

+-----------------------+-----------------------

| Variable_name | Value

+-----------------------+-----------------------

| character_set_client | utf8

| character_set_connection | utf8

| character_set_database | utf8

| character_set_filesystem | binary

| character_set_results | utf8

| character_set_server | utf8

| character_set_system | utf8

| character_sets_dir | /usr/share/mysql/charsets/

+---------------------+---------------------------

第二步:在要發送中文或者要讀取中文的JSP頁面(最好所有頁面)都添加如下聲明:

<%@page pageEncoding="UTF-8"%>

<%@ page contentType="text/html;charset=utf-8"%>

<% request.setCharacterEncoding("utf-8"); %>

在標簽對中添加如下:

注意在servlet中對請求進行響應的方法中同樣要有:

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

第三步:(由于不明原因firefox發送的請求仍然是latin1的時候執行這一步)

在將請求的參數插入數據庫之前還要再執行一次轉碼(將latin1編碼轉換為utf-8),例如:

String utf8_str = new String( latin_str .getBytes("latin1"),"utf-8");

這一步可以寫在一個過濾器中,不怕麻煩也可以在每一次在將請求數據插入之前都進行一次轉碼。

另外:在連接數據庫的時候可以不用加上字符集參數了,直接用用戶名和密碼連接就可以了,如連接:

con=DriverManager.getConnection("jdbc:mysql://localhost:3306/數據庫名","用戶名","密碼");
北京pk10计划在线计划