當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 江西OA系統(tǒng) > 南昌OA系統(tǒng) > 南昌OA信息化
Java中如何正確使用字體編碼
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
文章來(lái)源:泛普軟件在Java編程中,中文字體編碼難倒了不少程序員,如果抓住了影響Java中文顯示的幾個(gè)關(guān)鍵因素,問(wèn)題將迎刃而解。
Java是目前最流行的面向?qū)ο蟮木幊陶Z(yǔ)言之一,Java支持UTF-8、ISO-8859-1、GBK等各種字體編碼,可筆者發(fā)現(xiàn)Java中字體編碼的問(wèn)題仍難倒了不少程序員,網(wǎng)上雖然也有不少關(guān)于在Java中如何正確顯示中文的文章,但都不夠全面,筆者特意總結(jié)如下。
影響Java中字體編碼正確顯示的有幾個(gè)因素: 1)數(shù)據(jù)庫(kù)的連接方式; 2)網(wǎng)頁(yè)中使用的字體編碼; 3)數(shù)據(jù)庫(kù)里存放數(shù)據(jù)的字體編碼; 4)Java的缺省字體編碼。如果在編程中遇到不能正確顯示中文時(shí),要先弄清楚以上幾項(xiàng)所使用的字體編碼,再分析找出原因,即可解決問(wèn)題。
眾所周知,JSP是Java的一種,和網(wǎng)頁(yè)有關(guān),而網(wǎng)頁(yè)也有自己的中文編碼系統(tǒng),所以JSP處理中文要比純Java的類文件更為麻煩。本文的測(cè)試數(shù)據(jù)庫(kù)是MySQL3.2,數(shù)據(jù)庫(kù)連接驅(qū)動(dòng)是用org.gjt.mm.mysql.Driver,這里主要討論UTF-8和GBK的顯示( GB2312是GBK的一個(gè)子集,Java中可以使用GBK來(lái)代替GB系列)。我們先來(lái)研究JSP中字體編碼問(wèn)題, 下面第一到第六點(diǎn)是針對(duì)JSP的(因?yàn)閺臄?shù)據(jù)庫(kù)里讀出中文數(shù)據(jù)與寫入中文數(shù)據(jù)有所區(qū)別,咱們分別說(shuō)明,前三點(diǎn)是從讀取數(shù)據(jù)庫(kù)到顯示在網(wǎng)頁(yè),后三點(diǎn)是從網(wǎng)頁(yè)輸入數(shù)據(jù)到存入數(shù)據(jù)庫(kù)),第七到第九點(diǎn)針對(duì)純Java的類文件。 以下rs表示ResultSet的一個(gè)實(shí)例,是執(zhí)行Select語(yǔ)句之后產(chǎn)生的數(shù)據(jù)集。
一、數(shù)據(jù)庫(kù)連接方式使用UTF-8
在連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)后面加上這句參數(shù)useUnicode=true&characterEncoding=
UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=
true&characterEncoding=UTF-8,從數(shù)據(jù)庫(kù)里讀出中文顯示在使用GBK的JSP的網(wǎng)頁(yè)里,如果數(shù)據(jù)庫(kù)里存放的字體編碼是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正確顯示中文。如果數(shù)據(jù)庫(kù)里存放的是GBK數(shù)據(jù),那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")來(lái)顯示正確的中文。值得注意的是如果頁(yè)面使用UTF-8,數(shù)據(jù)庫(kù)里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正確顯示中文。如果網(wǎng)頁(yè)是UTF-8,而數(shù)據(jù)庫(kù)里存放的是GBK,無(wú)法直接顯示中文,需要2步轉(zhuǎn)換, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正確顯示中文。
二、數(shù)據(jù)庫(kù)連接方式使用GBK
在連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)后面加上這句參數(shù)useUnicode=true&characterEncoding=
GBK,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&UseUnicode=true&
characterEncoding=GBK,從數(shù)據(jù)庫(kù)里讀出中文,顯示在使用GBK的JSP的網(wǎng)頁(yè)里,如果數(shù)據(jù)庫(kù)里存放的字體編碼是UTF-8,在JSP中一定要使用 str=new String(rs.getBytes(1),"UTF-8"),才正確顯示中文。如果數(shù)據(jù)庫(kù)里存放的是GBK數(shù)據(jù),那么JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1),即可顯示正確的中文。 如果網(wǎng)頁(yè)是UTF-8,而數(shù)據(jù)庫(kù)里存放的是GBK,只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法來(lái)顯示中文; 如果網(wǎng)頁(yè)是UTF-8,而數(shù)據(jù)庫(kù)里存放的是UTF-8,可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法來(lái)顯示中文。
三、使用缺省數(shù)據(jù)庫(kù)連接方式
連接數(shù)據(jù)庫(kù)的驅(qū)動(dòng)后面沒(méi)有這句參數(shù)useUnicode=&characterEncoding=,例如jdbc:mysql://localhost/DBVF?autoReconnect=true,沒(méi)有參數(shù)useUnicode=true&characterEncoding,表示使用默認(rèn)的ISO-8895-1編碼。
1. 從數(shù)據(jù)庫(kù)里讀出中文,顯示在GBK的網(wǎng)頁(yè)里。如果數(shù)據(jù)庫(kù)里存放的字體編碼是UTF-8,在JSP網(wǎng)頁(yè)中一定要使用語(yǔ)句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"),才可正確顯示中文。如果數(shù)據(jù)庫(kù)里存放的是GBK數(shù)據(jù),那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")或str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK") 顯示正確的中文。
2. 如果網(wǎng)頁(yè)是UTF-8,不能直接正確顯示GBK,需要2步轉(zhuǎn)換,str=new String(rs.getBytes(1),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK") 才可以正確顯示中文。如果數(shù)據(jù)庫(kù)里存的是UTF-8,直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就可以顯示中文了。
以上是讀取數(shù)據(jù)庫(kù)里中文正確顯示在網(wǎng)頁(yè)上,下面三點(diǎn)是如何正確存入數(shù)據(jù)庫(kù)。
四、數(shù)據(jù)庫(kù)連接方式使用UTF-8編碼
JSP中要把網(wǎng)頁(yè)輸入的中文存入數(shù)據(jù)庫(kù),通常有一個(gè)提交(Submit)的過(guò)程,是用str=request.getParameter("username"),然后執(zhí)行update或者insert語(yǔ)句來(lái)存入數(shù)據(jù)庫(kù)。如何賦值給str很重要,而且這里中文輸入與網(wǎng)頁(yè)所使用的字體編碼有關(guān)。
1、 網(wǎng)頁(yè)使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),都可以使得存到數(shù)據(jù)庫(kù)里的數(shù)據(jù)是UTF-8編碼。
2. 網(wǎng)頁(yè)使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那么存入數(shù)據(jù)庫(kù)的是UTF-8編碼。
3. 值得注意的是使用UTF-8的數(shù)據(jù)庫(kù)連接方式不能存得GBK。
五、數(shù)據(jù)庫(kù)連接方式使用GBK編碼
1. 輸入使用GBK網(wǎng)頁(yè),存到數(shù)據(jù)庫(kù)里是GBK的方法: str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"GBK")。
2. 網(wǎng)頁(yè)使用GBK,想存入U(xiǎn)TF-8到數(shù)據(jù)庫(kù)里,要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK")即可。
3. 網(wǎng)頁(yè)使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),那么存到數(shù)據(jù)庫(kù)里的數(shù)據(jù)是UTF-8編碼。
4. 網(wǎng)頁(yè)使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"),那么存到數(shù)據(jù)庫(kù)里的數(shù)據(jù)是GBK編碼。
六、數(shù)據(jù)庫(kù)連接方式使用缺省,即不使用參數(shù)useUnicode和characterEncoding
1. 網(wǎng)頁(yè)使用GBK,如果使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes()),那么在數(shù)據(jù)庫(kù)里的數(shù)據(jù)是GBK碼。網(wǎng)頁(yè)使用UTF-8 和使用str= request.getParameter("username"),則存入數(shù)據(jù)庫(kù)是UTF-8編碼。
2. 如果使用str= new String(request.getParameter("username").getBytes("ISO-8859-1")),那么根據(jù)網(wǎng)頁(yè)提供的字體編碼而存到數(shù)據(jù)庫(kù)里,比如是UTF-8的網(wǎng)頁(yè),那么存到數(shù)據(jù)庫(kù)中就是UTF-8編碼,如果使用GBK網(wǎng)頁(yè),那么存到數(shù)據(jù)庫(kù)里的字就是GBK編碼。
3. 如果使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")這一種組合能存到正確的數(shù)據(jù)外,其他存到數(shù)據(jù)庫(kù)里的數(shù)據(jù)則都是亂碼或者錯(cuò)誤碼。在這個(gè)UTF-8組合的特例中,網(wǎng)頁(yè)使用的是GBK,則存放到數(shù)據(jù)庫(kù)里就是GBK,網(wǎng)頁(yè)使用UTF-8,那么存到數(shù)據(jù)庫(kù)里的就是UTF-8。
4. 網(wǎng)頁(yè)是GBK的要存得UTF-8,一定需要2步: company=new String(request.getParameter("company").getBytes(),"GBK")和company=new String(company.getBytes("UTF-8"))。
5. 網(wǎng)頁(yè)是UTF-8的,不能存得GBK在數(shù)據(jù)庫(kù)里,一句話,改變數(shù)據(jù)庫(kù)連接方式不能存得GBK碼。
以上所有的都是基于JSP網(wǎng)頁(yè)和數(shù)據(jù)庫(kù)交換數(shù)據(jù),下面討論一下純JAVA編程下的字體編碼轉(zhuǎn)換。
七、數(shù)據(jù)庫(kù)連接方式使用UTF-8編碼
1. 數(shù)據(jù)庫(kù)里的中文是UTF-8,可以轉(zhuǎn)換為GBK,但不能把GBK存入數(shù)據(jù)庫(kù)。
2. 數(shù)據(jù)庫(kù)是GBK,如果轉(zhuǎn)換為UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接將content存入數(shù)據(jù)庫(kù)就可為UTF-8。
八、數(shù)據(jù)庫(kù)連接方式使用GBK編碼
1. 數(shù)據(jù)庫(kù)里的中文是UTF-8,如果轉(zhuǎn)換為GBK,使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert語(yǔ)句插入到數(shù)據(jù)庫(kù),即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes()),再存入數(shù)據(jù)庫(kù)即存得還是UTF-8編碼。
2. 數(shù)據(jù)庫(kù)里的中文是GBK,如果轉(zhuǎn)換為UTF-8,使用content= new String(rs.getString(2).getBytes("UTF-8"))或者content= new String(rs.getString(2).getBytes("UTF-8"),"GBK"),再直接使用update或者insert語(yǔ)句插入到數(shù)據(jù)庫(kù),即存得UTF-8。
3. 如果某個(gè)String是GBK,要轉(zhuǎn)換為UTF-8,也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 如果某個(gè)String是UTF-8,要轉(zhuǎn)換為GBK,應(yīng)該使用new String(UTFstr.getBytes("GBK"),"UTF-8")。
九、數(shù)據(jù)庫(kù)連接方式使用缺省,即不跟參數(shù)
1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"),可以將數(shù)據(jù)庫(kù)里的GBK編碼轉(zhuǎn)換為UTF-8。
2. 讀取UTF-8然后存入U(xiǎn)TF-8,則用str1=new String(UTFstr.getBytes(),"ISO-8859-1")或者str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1")。
3. 不能實(shí)現(xiàn)數(shù)據(jù)庫(kù)里的UTF-8轉(zhuǎn)換為GBK。
如果采用UTF-8的數(shù)據(jù)庫(kù)連接方式或者缺省數(shù)據(jù)連接方式,那么無(wú)法將UTF-8轉(zhuǎn)為GBK;而GBK的數(shù)據(jù)庫(kù)連接方式可以實(shí)現(xiàn)UTF-8和GBK的相互轉(zhuǎn)換。建議大家采用GBK的數(shù)據(jù)連接方式。
- 1用iptable來(lái)提高網(wǎng)絡(luò)安全用
- 2P2P蠕蟲(chóng)開(kāi)始肆虐網(wǎng)絡(luò)
- 3金鄉(xiāng)縣執(zhí)法局舉行OA辦公自動(dòng)化系統(tǒng)培訓(xùn)
- 42013年IT預(yù)算將在移動(dòng)和云領(lǐng)域
- 5以協(xié)同OA為平臺(tái)深化人力資源管理
- 6信息化打通企業(yè)“任督”二脈
- 7數(shù)據(jù)集市技術(shù)應(yīng)用一瞥
- 8現(xiàn)代企業(yè)辦公需要智能化OA
- 9BYOD推高移動(dòng)OA浪潮
- 1030秒清除Windows系統(tǒng)所有垃圾
- 11營(yíng)造播存網(wǎng)格
- 12協(xié)同OA的年假批量處理設(shè)置與年假管理
- 13OA軟件為單位實(shí)現(xiàn)強(qiáng)而有力的企業(yè)管控
- 14用EJB 3.0簡(jiǎn)化企業(yè)Java開(kāi)發(fā)
- 15泛普軟件:云計(jì)算是如何幫助大數(shù)據(jù)實(shí)現(xiàn)經(jīng)濟(jì)效益
- 16OA系統(tǒng)“智能化”如何實(shí)現(xiàn)?
- 17解析三大容災(zāi)技術(shù)
- 18解構(gòu)Windows部署服務(wù)
- 19泛普OA軟件讓理念不再與產(chǎn)品脫節(jié)
- 20OA系統(tǒng)的發(fā)展需要單位大膽的去使用
- 21怎樣處理Oracle數(shù)據(jù)庫(kù)中的壞塊
- 22OA辦公系統(tǒng)選型哪個(gè)更能打動(dòng)CIO
- 23企業(yè)輕松管理辦公 一切從OA開(kāi)始
- 24OWA使用十大竅門
- 25搜索引擎的企業(yè)應(yīng)用
- 26EJB 3.0的三大類型
- 27移動(dòng)OA正在崛起
- 28吉安建設(shè)OA辦公系統(tǒng)
- 29SQL Server 2005升級(jí)的十個(gè)步驟
- 30南昌OA辦公和HR系統(tǒng)是怎么整合的?
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓