java中处理字符编码(网页与数据库)(转)
首先聲明一下,此文章時從網上轉載的。如下的某些方法是確實管用,但是從中發現了有一點不足,就是原文筆者沒考慮使用不同Web Server時出現的情況,比如文章里我用紅色字體畫出來的部分代碼在Tomcat跑的時候得用他說的方法,不過到了WebSphere的時候必須得用原先的?
String name = request.getParameter("name");?
所以采取本文方法的時候不要太死板,多試試。?
在Java編程中,中文字體編碼難倒了不少程序員,如果抓住了影響Java中文顯示的幾個關鍵因素,問題將迎刃而解。?
Java是目前最流行的面向對象的編程語言之一,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/DBName?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的數據連接方式。
http://lasombra.iteye.com/blog/993069
?
總結
以上是生活随笔為你收集整理的java中处理字符编码(网页与数据库)(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将一个数组划分为和差值最小的子数组
- 下一篇: Java并发编程:CopyOnWrite