java+sql 編碼 UTF-八、ISO-8859-一、GBK

摘錄自:http://www.cnblogs.com/yezhenhan/archive/2011/01/14/1935376.htmlhtml

java 編碼 UTF-八、ISO-8859-一、GBK

Java支持UTF-八、ISO-8859-一、GBK等各類字體編碼,可筆者發現Java中字體編碼的問題仍難倒了很多程序員,網上雖然也有很多關於在Java中如何正確顯示中文的文章,但都不夠全面,筆者特地總結以下。

影響Java中字體編碼正確顯示的有幾個因素: 1)數據庫的鏈接方式; 2)網頁中使用的字體編碼; 3)數據庫裏存放數據的字體編碼; 4)Java的缺省字體編碼。若是在編程中遇到不能正確顯示中文時,要先弄清楚以上幾項所使用的字體編碼,再分析找出緣由,便可解決問題。

衆所周知,JSP是Java的一種,和網頁有關,而網頁也有本身的中文編碼系統,因此JSP處理中文要比純Java的類文件更爲麻煩。本文的測試數據庫是MySQL3.2,數據庫鏈接驅動是用org.gjt.mm.mysql.Driver,這裏主要討論UTF-8和GBK的顯示( GB2312是GBK的一個子集,Java中可使用GBK來代替GB系列)。咱們先來研究JSP中字體編碼問題,下面第一到第六點是針對JSP的(由於從數據庫裏讀出中文數據與寫入中文數據有所區別,我們分別說明,前三點是從讀取數據庫到顯示在網頁,後三點是從網頁輸入數據到存入數據庫),第七到第九點針對純Java的類文件。如下rs表示ResultSet的一個實例,是執行Select語句以後產生的數據集。

1、數據庫鏈接方式使用UTF-8

在鏈接數據庫的驅動後面加上這句參數useUnicode=true&characterEncoding=

UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=

true&characterEncoding=UTF-8,從數據庫裏讀出中文顯示在使用GBK的JSP的網頁裏,若是數據庫裏存放的字體編碼是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),能夠正確顯示中文。若是數據庫裏存放的是 GBK數據,那麼JSP中也要使用str=new String(rs.getBytes(1),"GBK")來顯示正確的中文。值得注意的是若是頁面使用UTF-8,數據庫裏存放的是UTF-8,也能夠用str=new String(rs.getBytes(1),"GBK")正確顯示中文。若是網頁是UTF-8,而數據庫裏存放的是GBK,沒法直接顯示中文,須要2步轉換, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才能夠正確顯示中文。

2、數據庫鏈接方式使用GBK

在鏈接數據庫的驅動後面加上這句參數useUnicode=true&characterEncoding=

GBK,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&UseUnicode=true&

characterEncoding=GBK,從數據庫裏讀出中文,顯示在使用GBK的JSP的網頁裏,若是數據庫裏存放的字體編碼是 UTF-8,在JSP中必定要使用 str=new String(rs.getBytes(1),"UTF-8"),才正確顯示中文。若是數據庫裏存放的是GBK數據,那麼JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1),便可顯示正確的中文。若是網頁是UTF-8,而數據庫裏存放的是GBK,只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法來顯示中文; 若是網頁是UTF-8,而數據庫裏存放的是UTF-8,可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法來顯示中文。

3、使用缺省數據庫鏈接方式

鏈接數據庫的驅動後面沒有這句參數useUnicode=&characterEncoding=,例如 jdbc:mysql://localhost/DBVF?autoReconnect=true,沒有參數useUnicode=true& characterEncoding,表示使用默認的ISO-8895-1編碼。

1. 從數據庫裏讀出中文,顯示在GBK的網頁裏。若是數據庫裏存放的字體編碼是UTF-8,在JSP網頁中必定要使用語句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"),纔可正確顯示中文。若是數據庫裏存放的是GBK數據,那麼JSP中也要使用str=new String(rs.getBytes(1),"GBK")或str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK") 顯示正確的中文。

2. 若是網頁是UTF-8,不能直接正確顯示GBK,須要2步轉換,str=new String(rs.getBytes(1),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK") 才能夠正確顯示中文。若是數據庫裏存的是UTF-8,直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就能夠顯示中文了。

以上是讀取數據庫裏中文正確顯示在網頁上,下面三點是如何正確存入數據庫。

4、數據庫鏈接方式使用UTF-8編碼

JSP中要把網頁輸入的中文存入數據庫,一般有一個提交(Submit)的過程,是用 str=request.getParameter("username"),而後執行update或者insert語句來存入數據庫。如何賦值給str 很重要,並且這裏中文輸入與網頁所使用的字體編碼有關。

一、 網頁使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),均可以使得存到數據庫裏的數據是UTF-8編碼。

2. 網頁使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那麼存入數據庫的是UTF-8編碼。

3. 值得注意的是使用UTF-8的數據庫鏈接方式不能存得GBK。

5、數據庫鏈接方式使用GBK編碼

1. 輸入使用GBK網頁,存到數據庫裏是GBK的方法: str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"GBK")。

2. 網頁使用GBK,想存入UTF-8到數據庫裏,要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK")便可。

3. 網頁使用UTF-8,並且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),那麼存到數據庫裏的數據是 UTF-8編碼。

4. 網頁使用UTF-8,並且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"),那麼存到數據庫裏的數據是GBK編碼。

6、數據庫鏈接方式使用缺省,即不使用參數useUnicode和characterEncoding

1. 網頁使用GBK,若是使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes()),那麼在數據庫裏的數據是GBK碼。網頁使用 UTF-8 和使用str= request.getParameter("username"),則存入數據庫是UTF-8編碼。

2. 若是使用str= new String(request.getParameter("username").getBytes("ISO-8859-1")),那麼根據網頁提供的字體編碼而存到數據庫裏,好比是UTF-8的網頁,那麼存到數據庫中就是UTF-8編碼,若是使用GBK網頁,那麼存到數據庫裏的字就是GBK編碼。

3. 若是使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")這一種組合能存到正確的數據外,其餘存到數據庫裏的數據則都是亂碼或者錯誤碼。在這個UTF-8組合的特例中,網頁使用的是GBK,則存放到數據庫裏就是GBK,網頁使用UTF-8,那麼存到數據庫裏的就是UTF-8。

4. 網頁是GBK的要存得UTF-8,必定須要2步: company=new String(request.getParameter("company").getBytes(),"GBK")和company=new String(company.getBytes("UTF-8"))。

5. 網頁是UTF-8的,不能存得GBK在數據庫裏,一句話,改變數據庫鏈接方式不能存得GBK碼。

以上全部的都是基於JSP網頁和數據庫交換數據,下面討論一下純JAVA編程下的字體編碼轉換。

7、數據庫鏈接方式使用UTF-8編碼

1. 數據庫裏的中文是UTF-8,能夠轉換爲GBK,但不能把GBK存入數據庫。

2. 數據庫是GBK,若是轉換爲UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接將content存入數據庫就可爲UTF-8。

8、數據庫鏈接方式使用GBK編碼

1. 數據庫裏的中文是UTF-8,若是轉換爲GBK,使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert語句插入到數據庫,即存得GBK。若是使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes()),再存入數據庫即存得仍是UTF-8編碼。

2. 數據庫裏的中文是GBK,若是轉換爲UTF-8,使用content= new String(rs.getString(2).getBytes("UTF-8"))或者content= new String(rs.getString(2).getBytes("UTF-8"),"GBK"),再直接使用update或者insert語句插入到數據庫,即存得UTF-8。

3. 若是某個String是GBK,要轉換爲UTF-8,也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 若是某個String是UTF-8,要轉換爲GBK,應該使用new String(UTFstr.getBytes("GBK"),"UTF-8")。

9、數據庫鏈接方式使用缺省,即不跟參數

1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"),能夠將數據庫裏的GBK編碼轉換爲UTF-8。

2. 讀取UTF-8而後存入UTF-8,則用str1=new String(UTFstr.getBytes(),"ISO-8859-1")或者str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1")。

3. 不能實現數據庫裏的UTF-8轉換爲GBK。

若是採用UTF-8的數據庫鏈接方式或者缺省數據鏈接方式,那麼沒法將UTF-8轉爲GBK;而GBK的數據庫鏈接方式能夠實現UTF-8和GBK的相互轉換。建議你們採用GBK的數據鏈接方式。java

參考連接:
深刻剖析Java編程中的中文問題及建議最優解決方法
http://fafeng.blogbus.com/logs/3062998.html (1)
http://fafeng.blogbus.com/logs/3063006.html (2)mysql

相關文章
相關標籤/搜索