一、JSP頁面顯示亂碼
二、表單提交中文時出現亂碼
三、數據庫連
大家在JSP的開發過程中,經常出現中文亂碼的問題,可能一至困擾著您,我現在把我在JSP開發中遇到的中文亂碼的問題及解決辦法寫出來供大家參考。
一、JSP頁面顯示亂碼
下面的顯示頁面(display.jsp)就出現亂碼:
<html>
<head>
<title>JSP的中文處理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文處理");
%>
</body>
</html>
對不同的WEB服務器和不同的JDK版本,處理結果就不一樣。原因:服務器使用的編碼方式不同和瀏覽器對不同的字符顯示結果不同而導致的。解決辦法:在JSP頁面中指定編碼方式(gb2312),即在頁面的第一行加上:<%@ page contentType="text/html; charset=gb2312"%>,就可以消除亂碼了。完整頁面如下:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文處理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%
out.print("JSP的中文處理");
%>
</body>
</html>
二、表單提交中文時出現亂碼
下面是一個提交頁面(submit.jsp),代碼如下:
<html>
<head>
<title>JSP的中文處理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
下面是處理頁面(process.jsp)代碼:
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文處理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
如果submit.jsp提交英文字符能正確顯示,如果提交中文時就會出現亂碼。原因:瀏覽器默認使用UTF-8編碼方式來發送請求,而UTF-8和GB2312編碼方式表示字符時不一樣,這樣就出現了不能識別字符。解決辦法:通過request.setCharacterEncoding("gb2312")對請求進行統一編碼,就實現了中文的正常顯示。修改后的process.jsp代碼如下:
<%@ page contentType="text/html; charset=gb2312"%>
<%
request.seCharacterEncoding("gb2312");
%>
<html>
<head>
<title>JSP的中文處理</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<%=request.getParameter("name")%>
</body>
</html>
三、數據庫連接出現亂碼
只要涉及中文的地方全部是亂碼,解決辦法:在數據庫的數據庫URL中加上useUnicode=true&characterEncoding=GBK就OK了。
四、數據庫的顯示亂碼
在mysql4.1.0中,varchar類型,text類型就會出現中文亂碼,對于varchar類型把它設為binary屬性就可以解決中文問題,對于text類型就要用一個編碼轉換類來處理,實現如下:
public class Convert {
/** 把ISO-8859-1碼轉換成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("編碼轉換錯誤:"+e.getMessage());
return "";
}
}
}
把它編譯成class,就可以調用Convert類的靜態方法ISOtoGB()來轉換編碼。
=================================================================
JSP中的亂碼問題解決方案
(以下瀏覽器均為IE,服務器為tomcat)
服務器發送頁面給瀏覽器時有兩個地方指定encoding
一處是在http應答的header里
一處是在html文檔里
1.http頭設置編碼
若在jsp中request.setContentType("text/html; encoding=gb2312");
這就明確告訴瀏覽器這篇文檔是gb2312編碼的,瀏覽器不作任何轉換,只是以
gb2312來顯示.若文檔中有8859_1編碼的字串,將會出現亂碼.
若jsp中干脆就沒有setContentType,服務器會把http頭的中的編碼設為8859_1,
瀏覽器通過http頭就認為這篇文檔是8859_1編碼的(而不管文檔真正的編碼是什么
),會以8859_1來顯示.
若文檔中有8859_1編碼的中文字串,只要手動調整瀏覽器的encoding到gb2312,瀏
覽器會做一個8859_1到gb2312的轉換,并以gb2312來顯示,你會看到正確的文字.
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
碼.
于是,我們在jsp中來一句
request.setContentType("text/html; encoding=");
哈哈,這樣瀏覽器就把文檔默認為是8859_1編碼的.
如果html文檔中有
<meta http-equiv="Content-Type" content="t會出現亂碼.
若jsp中干脆就沒有setContentType,服務器會把http頭的中的編碼設為8859_1,
瀏覽器通過http頭就認為這篇文檔是8859_1編碼的(而不管文檔真正的編碼是什么
),會以8859_1來顯示.
若文檔中有8859_1編碼的中文字串,只要手動調整瀏覽器的encoding到gb2312,瀏
覽器會做一個8859_1到gb2312的轉換,并以gb2312來顯示,你會看到正確的文字.
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
碼.
于是,我們在jsp中來一句
request.setContentType("text/html; encoding=");
哈哈,這樣瀏覽器就把文檔默認為是8859_1編碼的.
如果html文檔中有
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
那么瀏覽器就會做一個8859_1到gb2312的轉換,并以gb2312來顯示.
由于我們在jsp中輸出的中文字串都是8859_1編碼的,所有的轉換都由瀏覽器來完成的,所以
我們看到的是正確的文字.
體會:整篇文檔的encoding必須一致.
在上文第1種情況中,文檔中編碼不一致,出現亂碼,怎么調都不行.
第2種情況中,文檔中的編碼都是一致的,但瀏覽器的顯示方式不對,需手動調整.
第3種情況中,文檔中的編碼都是一致的(8859_1),瀏覽器的顯示方式也對了,因此就正確了.
(以下瀏覽器均為IE,服務器為tomcat)
服務器發送頁面給瀏覽器時有兩個地方指定encoding
一處是在http應答的header里
一處是在html文檔里
1.http頭設置編碼
若在jsp中request.setContentType("text/html; encoding=gb2312");
這就明確告訴瀏覽器這篇文檔是gb2312編碼的,瀏覽器不作任何轉換,只是以
gb2312來顯示.若文檔中有8859_1編碼的字串,將會出現亂碼.
若jsp中干脆就沒有setContentType,服務器會把http頭的中的編碼設為8859_1,
瀏覽器通過http頭就認為這篇文檔是8859_1編碼的(而不管文檔真正的編碼是什么
),會以8859_1來顯示.
若文檔中有8859_1編碼的中文字串,只要手動調整瀏覽器的encoding到gb2312,瀏
覽器會做一個8859_1到gb2312的轉換,并以gb2312來顯示,你會看到正確的文字.
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
碼.
于是,我們在jsp中來一句
request.setContentType("text/html; encoding=");
哈哈,這樣瀏覽器就把文檔默認為是8859_1編碼的.
如果html文檔中有
<meta http-equiv="Content-Type" content="t會出現亂碼.
若jsp中干脆就沒有setContentType,服務器會把http頭的中的編碼設為8859_1,
瀏覽器通過http頭就認為這篇文檔是8859_1編碼的(而不管文檔真正的編碼是什么
),會以8859_1來顯示.
若文檔中有8859_1編碼的中文字串,只要手動調整瀏覽器的encoding到gb2312,瀏
覽器會做一個8859_1到gb2312的轉換,并以gb2312來顯示,你會看到正確的文字.
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
但這樣每次都要手動來改變瀏覽器的encoding很麻煩.
2.在html文檔中設置編碼
要讓html文檔中設置的編碼有效,必須把http頭中的編碼設為空.
上文說過,如果jsp中沒有setContentType,服務器會把http頭的中的編碼設為
8859_1, 這樣一來,瀏覽器還是只認http頭中設置的編碼而不認html文檔中設的編
碼.
于是,我們在jsp中來一句
request.setContentType("text/html; encoding=");
哈哈,這樣瀏覽器就把文檔默認為是8859_1編碼的.
如果html文檔中有
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
那么瀏覽器就會做一個8859_1到gb2312的轉換,并以gb2312來顯示.
由于我們在jsp中輸出的中文字串都是8859_1編碼的,所有的轉換都由瀏覽器來完成的,所以
我們看到的是正確的文字.
體會:整篇文檔的encoding必須一致.
在上文第1種情況中,文檔中編碼不一致,出現亂碼,怎么調都不行.
第2種情況中,文檔中的編碼都是一致的,但瀏覽器的顯示方式不對,需手動調整.
第3種情況中,文檔中的編碼都是一致的(8859_1),瀏覽器的顯示方式也對了,因此就正確了.
=================================================================
Mysql與JSP網頁中文亂碼問題的解決方案
自從以前學習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 {
// ----------------------------------------------------- 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
其它的字集符也有類似的區別
=============================================================
告別JSP+MySQL亂碼問題V1.0
附件:告別JSP+MySQL亂碼問題V1.0.rar
《JSP數據庫開發實例精粹》一書問世以來, 接到許多讀者求救, 其中有80%以上的問題是關于配置以及亂碼問題,配置問題只要根據書中視頻依次安裝J2SDK, Tomcat, MySQL(Server+Client),一般都可以解決,但亂碼問題讓許多讀者苦不堪言,現針對亂碼問題解決如下,相信一定可以將仍困惑在亂碼問題中的讀者解救出來。
【聲明】:本文僅對本文所采用的軟件環境負責,如果你采用的是其他軟件環境,只好自己觸類旁通了。
【版本】:V1.0,最后更新于2005-8-3,請大家認準版本與時間,如果你是在幾年后看到此文,請不要歉棄老土。^_^
-----------------------------------------------------------------------
【軟件環境】:
OS: Windows 2000 SP4, Windows XP SP2,
JDK:j2sdk-1_4_2_08-windows-i586-p.exe,
Tomcat: jakarta-tomcat-5.0.28.exe,
MySQL: mysql-5.0.10a-beta-win32.zip;
--------------------------------------------------------------------
【寫在前面的說明】 (必讀):
1>本文將消除亂碼分為三步:
>消除頁面亂碼,
>消除從MySQL中讀出中文亂碼,
>消除插入MySQL數據庫中的中文亂碼;
2>沒有測試tomcat-5.5. + jdk5,但我想應該更容易些吧;
3>先安裝J2SDK,后裝Tomcat,如果J2SDK安裝在c:\j2sdk1.4.2_08,它同時會在C:\Program Files\Java\Jre下安裝一個public的Jre,在安裝Tomcat時,一定要將JDK指向C:\j2sdk1.4.2_08,否則無法編譯JSP;
4>注意采用本方法后,操作數據庫時的相關中文數據無需做額外的字符轉換處理,即在所有的字符處理過程中,都以GB2312或GBK來處理;
5>隨本文發行的有兩個純JSP文件和一個SQL腳本,testCh***t.jsp用來測試“消除純JSP和HTML頁面中的亂碼”,tstMySQL.jsp用來測試“消除從MySQL中讀出中文的亂碼”,均無需手工編譯,放在任一個Web目錄下即可使用。bookshop.sql為tstMySQL.jsp中用到的數據庫,也為《雋雋在線書店》中的更新數據庫;
6>在2k中比在XP中看到亂碼的情況多一些,表現為在2K中meta標記不起作用,只能使用page指令,具體原因不太清楚,還望賜教。
7>關于MySQL的客戶端功具,個人習慣使用MySQL CC,雖然它已不受支持,但本書中全部腳本(使用My SQL數據庫的案例)都可以在MySQL CC中正常運行,有些在mysql-query-browser-1.1.13-win.msi出錯;
8>從MySQL中讀出的亂碼,如果用MySQL 客戶端顯示正常而在網頁中亂碼,在確定數據庫連接串中的字符集正確的情況下,把WEB-INF/classes/下,不是你創建的庫刪除。例如本書《在線書店》就存在此問題,讓WEB-INF/classes/目錄下只剩bookshop目錄,則可解決亂碼。
9>每次修改Bean后,最好重啟tomcat,而且最好把Tomcat中Work目錄下的相應目錄刪除,否則可能導致你的修改沒有更新,陷入進一步的痛苦中……
10>修改JSP文件無需重啟Tomcat;
11>用SELECT語句檢索出的數據,因為使用Map緩存數據,key是區分大小寫的,應統一為大寫或小寫。但SELECT語句與數據表之間不區分大小寫;
如:
strSQL = "SELECT ID, Name FROM BookInfo "
……
rs.getInt("id"); // 錯誤
rs.getInt("ID"); // 正確
12>新版MySQL中加密密碼不應使用password,而應使用MD5或 SHA1;本書《醫院門診》存在此問題,因而無法登錄;
13>如果使用下面幾步仍不能消除從MySQL中讀出的中文亂碼,把WEB-INF\classes\目錄下非你自己開發的目錄刪除,此版發型的《雋雋在線書店》存在此問題;
14>如果以上方法仍有亂碼存在,應該是自己程序的細節問題了,比如有些地方特意調用了編碼轉換函數,
如 uniStr = new String(tempByte,"ISO8859_1");
15>注意編碼表示方式在JSP與MySQL中的區別,如下:
JSP: GB2312, GBK, UTF-8....
MySQL: gb2312, gbk, utf8....
-------------------------------------------------------
關鍵問題:編碼,建議統一為GB2312或GBK,本文使用GB2312,GBK未測試;
【Step1】: 消除純HTML頁和JSP頁在Tomcat環境下運行的亂碼
這個是由于流覽器無法選擇編碼方式造成的, 手動從IE中選擇“GB2312”即可解決;也可以網頁中加入META標記或Page指令;
META標記如下:
<meta http-equiv="Content-Type" content="text/html; charset=GB2312">
Page指令如下:
<%@ page language="java" contentType="text/html; ch***t=GB2312" pageEncoding="GB2312"%>
前面說明中已經提到, META在2K下可能不起作用(XP下時了時壞),因為簡單起見,加入Page指令似乎是一個一勞永逸的事情;
總結: 加入Page指令,一定可以使純JSP頁面或HTML頁面在Tomcat環境下正常顯示。
【Step2】: 消除從MySQL數據庫中讀出中文的亂碼
分為兩個目標: step1: 從MySQL客戶端查看中文正常, step2: 從網頁中查看中文正常;
1: 在用SQL腳本創建數據庫前,設置MySQL的默認編碼方式為“gb2312”,
此步可以在mysql-administrator-1.1.0-rc-win.msi中完成,或者是MySQL Server向導;
這樣設置完畢后再用SQL 腳本創建數據庫, 注意如果SQL腳本中有設置字符集為latin1或utf-8的語句,一定要刪除。
已發現目前版本《在線書店》中的SQL腳本中帶有設置默認字符集為latin1,一定要刪除!
創建數據庫完畢后,用MySQL CC或MySQL Admin可檢查所創建的數據庫的字符集,如果正確,則用MySQL CC或MySQL Admin都可以正常查看中文;
2: 一般情況下,到這一步,在網頁中已經基本能正常顯示中文了,但凡事總有例外,可以在數據庫連接串處再特別說明一下:
String url ="jdbc:mysql://localhost/BookStore?useUnicode=true&characterEncoding=gb2312";
conn=DriverManager.getConnection(url,"root","");
一般情況下用 String url ="jdbc:mysql://localhost/BookStore"應該就能正常顯示中文。
總結:修改MySQL Server數據庫默認字符集為“GB2312”,從MySQL讀出中文可正常顯示;
例外: 此時仍有可能還有亂碼,如本書光盤中的《在線書店》,請參見前面的說明。
【Step3】: 消除插入MySQL數據庫中的中文亂碼
此步比較簡單,在JSP頁面中加入如下代碼:
request.setCharacterEncoding("GB2312");
------------------------------------------------------
THE END, Enjoy it!
======================================================
MySql中文亂碼的解決方法- -
在
mysql4.1下,一些數據庫里面的中文會出現??亂碼現象.因為,4.1增加了對utf8的支持,這是件好事.但是,問題是大部分的程序,都是使用的gb2312/gbk這樣的編碼格式,如果把它們都改成utf8格式,要轉換成utf8需要解決的事情比較多.編輯器,瀏覽器,
mysql-server,
mysql-client,php,php-
mysql,cvs代碼管理,數據庫備份,還有合適的gb2312到utf8的轉換工具.諸多的環節需要考慮.
數據庫的格式轉換,文件程序的格式轉換,和
mysql-server的設置情況記錄一下.
當然真正的轉換,現在還沒有做,現在只是做點規劃.
關于??亂碼,是系統相關的各個環節之間進行代碼轉換出現的問題,比如在shell下用mysql這個程序對數據庫進行恢復,mysql會錯誤的把代碼進行轉換,導致亂碼出現,
在轉換之前,我們一定要清楚,文件是什么格式,數據庫內部是什么格式,都要統一到utf8下來,不對的要進行格式轉換.
1.數據庫的轉換.
以前數據庫里面的字符,應該都是gb2312格式,這時,需要把所有的數據庫文件導出成sql文本,然后對文本進行utf-8的格式轉換.這里要注意的是一些2進值的字段內容會出問題.幸好,在我的項目中,2進值內容都進行了base64編碼,如果數據庫中存在2進值的內容,就要對它們進行單獨的處理了.
用mysqldump把數據從mysql4.0中導出,此時得到的sql文件應該是gb2312的,然后用iconv這個程序把sql文件改為utf8
導出一個mysql4.0的庫(服務器:192.168.2.2 庫名:dbname):
mysqldump -h 192.168.2.2 --add-drop-table -c --set-charset=latin1 --allow-keywords --force -p -u root dbname >1.sql
內容轉換utf8
iconv -c -f gb2312 -t utf8 1.sql -o 2.sql
在導入到4.1之前,先把mysql-server和mysql-client設置到utf8模式.
修改/etc/mysq1/my.cnf,在[mysqld]和[mysql]各增加1行:
[mysqld]
character_set_server = utf8
[mysql]
default-character-set =utf8
保證讓服務器端和客戶端都默認工作在utf8模式下,重啟mysql-server后就可以導入了.
mysql -u root -h localhost test <2.sql
到這里,一個數據庫就轉換完成了.已經完全工作在utf8模式下了.
php的程序的修改.也可以用iconv程序.進行.
首先從cvs導出一個干凈的代碼拷貝,比如在net目錄下,
cvs -d :pserver:xxx.xxx.xx.xx net co
刪除一些不需要轉換的文件
然后執行轉換
find . -name "*.php" -type f -exec mv {} {}.old \; -exec iconv --verbose -f gb2312 -t utf8 {}.old -o {} \; -exec rm {}.old \;
至此,php代碼就批量的轉換到utf8模式.還有就是只要修改html的head的語言聲明,從gb2312改成utf8,瀏覽器就會自動使用utf8的模式顯示這個頁面. content="text/html; charset=utf8"
最后,就是把編輯器改成utf8模式了.這個就比較簡單了.
好了,我們的web應用已經進入utf8模式了.哈哈.
在使用MYSQL時,插入中文字符,經常會出現亂碼,中文全被用?代替。
出現這種情況的原因,多是字符集不匹配造成的。
在MYSQL中,如果使用缺省的字符集,在建庫、建表時,默認使用的是latin1字符集,為ISO 8859-1西歐字符集。
插入中文字符時,與之不匹配,就會出現亂碼。
本人使用的是MYSQL 5.0版,并用C#操作MYSQL數據庫,當插入中文字符時,發現顯示的是亂碼。
初步估計是字符集沒有配對。查找后,發現MSYQL默認使用的是latin1,因此將數據庫的配置文件中的字符設置改為utf8,并在C#中將中文字符,轉為utf8,插入后,仍為亂碼。
MYSQL也支持gb2312,又將MYSQL的字符設置改為gb2312,C#中使用Default,重起MYSQL后,操作仍然無效。
后想起,雖然將MYSQL的字符集設置為gb2312或utf8,但已經建立的數據庫和表,仍采用的是默認的字符集,也即仍為當初的西歐字符集,最好,只得忍痛將數據庫刪除,重新以gb2312字符集建立數據庫和表。
再用C#插入中文字符后,一切OK。
再安裝好MYSQL后,可以手工或使用配置工具,將my.ini文件中的默認字符集改為gb2312,再重新建庫和表時,不用再在語句中指定字符集,其默認設置也即為gb2312,可以正常顯示中文字符集