[轉(zhuǎn)載]關(guān)于JSP讀寫(xiě)MySQL數(shù)據(jù)庫(kù)的中文問(wèn)題的測(cè)試
Posted on 2005-01-14 03:56 bigseal 閱讀(671) 評(píng)論(0) 編輯 收藏關(guān)于JSP讀寫(xiě)MySQL數(shù)據(jù)庫(kù)的中文問(wèn)題的測(cè)試
測(cè)試代碼:
1、 檢測(cè)WEB服務(wù)器端當(dāng)前語(yǔ)言設(shè)置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
獲取JSP運(yùn)行時(shí)所在的電腦(即WEB服務(wù)器)系統(tǒng)的file.encoding屬性可查出系統(tǒng)當(dāng)前的語(yǔ)言設(shè)置。
這一步獲得的語(yǔ)言設(shè)置值,在后面的測(cè)試記錄表中,稱(chēng)為“語(yǔ)言檢測(cè)值”。
2、 設(shè)置向客戶(hù)端輸出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜體部分可替換為BIG5或GBK,下同)
這里的GB2312或BIG5或GBK,在后面的測(cè)試記錄表中,稱(chēng)為“網(wǎng)頁(yè)字符集”。
3、 將用戶(hù)的輸入轉(zhuǎn)換為目標(biāo)字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
轉(zhuǎn)換輸入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
轉(zhuǎn)換函數(shù)convertStr代碼:










4、 顯示中文內(nèi)容:
轉(zhuǎn)換字符集后顯示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不轉(zhuǎn)換字符集即顯示:<%=rs.getString("Name")%>
...測(cè)試總結(jié):
1、 最簡(jiǎn)單通用的中文字符處理方案如下:
對(duì)簡(jiǎn)體中文系統(tǒng):
1) Windows2000或Redhat Linux7.0 WEB服務(wù)器端內(nèi)核置為簡(jiǎn)體中文,Redhat Linux7.0 WEB服務(wù)器還可置為英文;
2) 網(wǎng)頁(yè)字符集設(shè)為簡(jiǎn)體中文;
3) 將輸入內(nèi)容轉(zhuǎn)換為簡(jiǎn)體中文存儲(chǔ);
4) 輸出時(shí)不作字符集轉(zhuǎn)換。
對(duì)繁體中文系統(tǒng),將上述簡(jiǎn)體中文系統(tǒng)處理方案中的簡(jiǎn)體中文替換為繁體中文即可。
英文Windows2000服務(wù)器,可安裝(免費(fèi)?)多語(yǔ)言包,即可使用簡(jiǎn)體或繁體內(nèi)核。
注:目前只能將中文內(nèi)容以POST方式提交,尚未解決以GET方式提交中文參數(shù)的問(wèn)題。
2、 GBK字符集對(duì)GB2312支持很好,但對(duì)Big5支持并不完全,因此,不建議使用GBK作為網(wǎng)頁(yè)字符集,而對(duì)簡(jiǎn)體中文與繁體中文系統(tǒng)分別使用GB2312與Big5字符集
********************************************************************









































































下面是對(duì)上面所說(shuō)的一個(gè)回帖:
經(jīng)過(guò)我的多次測(cè)試,只有umljsp(夜未央天未白)的方法能夠解決我這里發(fā)生的問(wèn)題(也許每個(gè)人的開(kāi)發(fā)環(huán)境有差異而引起解決方法的不同)。
感謝所有提建議給我的朋友!非常感謝!
通過(guò)測(cè)試,學(xué)習(xí),再測(cè)試,再學(xué)習(xí),我覺(jué)得自己有必要總結(jié)一下,有說(shuō)的不對(duì)的地方請(qǐng)大家指正,另外某些專(zhuān)業(yè)性分析可能來(lái)自別的大蝦的貼子。
1.運(yùn)行環(huán)境:
Win2000(經(jīng)查,當(dāng)前語(yǔ)言設(shè)置為GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(數(shù)據(jù)庫(kù)的字符集設(shè)為none)
Mysql的Jdbc驅(qū)動(dòng)mm.mysql-2.0.11-bin.jar
2.出現(xiàn)的問(wèn)題:讀寫(xiě)Mysql數(shù)據(jù)庫(kù)出現(xiàn)亂碼(或????問(wèn)號(hào))
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,寫(xiě)入就正常了,但是中文輸 出就是亂碼了。
3.分析
我們所用到的數(shù)據(jù)庫(kù)讀寫(xiě)操作都是在Java環(huán)境下完成的,JAVA 語(yǔ)言默認(rèn)采用Unicode處理字符。
Mysql和Java之間兼容的似乎很好,
這就是為什么如果我們不對(duì)Jsp的輸出字符集做任何修改(如加上charset=gb2312),則Mysql數(shù)據(jù)庫(kù)的讀寫(xiě)都應(yīng)該沒(méi)問(wèn)題(如上述的a情況)的原因(只是讀出的中文輸出為亂碼)。
這一點(diǎn)在Access2000上反而沒(méi)有任何問(wèn)題,看來(lái)是Access2000對(duì)GBK(gb2312)編碼的支持比較好。
如果朋友們?cè)贛ysql的讀寫(xiě)數(shù)據(jù)庫(kù)中遇到問(wèn)題,可以試試如下方法:
(以下方法參照umljsp(夜未央天未白)給出的iso2gb()和gb2iso()方法)
方法1:
1.連接數(shù)據(jù)庫(kù) "jdbc:mysql://localhost/book?user=root"
2.讀數(shù)據(jù)庫(kù) 不需要轉(zhuǎn)碼
3.寫(xiě)數(shù)據(jù)庫(kù) 執(zhí)行g(shù)b2iso(String str)方法。具體參考此方法的實(shí)現(xiàn)
方法2:
1.連接數(shù)據(jù)庫(kù) jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.讀數(shù)據(jù)庫(kù) 執(zhí)行iso2gb(String str)方法。具體參考此方法的實(shí)現(xiàn)
3.寫(xiě)數(shù)據(jù)庫(kù) 執(zhí)行g(shù)b2iso(String str)方法。具體參考此方法的實(shí)現(xiàn)
從上面看似乎方法2的形式更對(duì)稱(chēng)一些,不過(guò)在以后免不了要多寫(xiě)一個(gè)轉(zhuǎn)換編碼的函數(shù),從頁(yè)面上看好像是不太舒服,不知大蝦們有沒(méi)有完美的解決方法?