1. 程式人生 > >SQLITE中文編碼轉換的問題終於解決了。

SQLITE中文編碼轉換的問題終於解決了。

java 編碼 UTF-8、ISO-8859-1、GBK

Java支援UTF-8、ISO-8859-1、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語句之後產生的資料集。

一、資料庫連線方式使用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"),才可以正確顯示中文。

二、資料庫連線方式使用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)方法來顯示中文。

三、使用預設資料庫連線方式

連線資料庫的驅動後面沒有這句引數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")就可以顯示中文了。

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

四、資料庫連線方式使用UTF-8編碼

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

1、 網頁使用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。

五、資料庫連線方式使用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編碼。

六、資料庫連線方式使用預設,即不使用引數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程式設計下的字型編碼轉換。

七、資料庫連線方式使用UTF-8編碼

1. 資料庫裡的中文是UTF-8,可以轉換為GBK,但不能把GBK存入資料庫。

2. 資料庫是GBK,如果轉換為UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接將content存入資料庫就可為UTF-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")。

九、資料庫連線方式使用預設,即不跟引數

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的資料連線方式。