<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實(shí)的筆,記錄編程路上的點(diǎn)點(diǎn)滴滴………
    posts - 536,comments - 394,trackbacks - 0

    ?

    Java支持UTF-8、ISO-8859-1、GBK等各種字體編碼,可筆者發(fā)現(xiàn)Java中字體編碼的問題仍難倒了不少程序員,網(wǎng)上雖然也有不少關(guān)于在Java中如何正確顯示中文的文章,但都不夠全面,筆者特意總結(jié)如下。

    影響Java中字體編碼正確顯示的有幾個因素: 1)數(shù)據(jù)庫的連接方式; 2)網(wǎng)頁中使用的字體編碼; 3)數(shù)據(jù)庫里存放數(shù)據(jù)的字體編碼; 4)Java的缺省字體編碼。如果在編程中遇到不能正確顯示中文時,要先弄清楚以上幾項(xiàng)所使用的字體編碼,再分析找出原因,即可解決問題。

    眾所周知,JSP是Java的一種,和網(wǎng)頁有關(guān),而網(wǎng)頁也有自己的中文編碼系統(tǒng),所以JSP處理中文要比純Java的類文件更為麻煩。本文的測試數(shù)據(jù)庫是MySQL3.2,數(shù)據(jù)庫連接驅(qū)動是用org.gjt.mm.mysql.Driver,這里主要討論UTF-8和GBK的顯示( GB2312是GBK的一個子集,Java中可以使用GBK來代替GB系列)。我們先來研究JSP中字體編碼問題, 下面第一到第六點(diǎn)是針對JSP的(因?yàn)閺臄?shù)據(jù)庫里讀出中文數(shù)據(jù)與寫入中文數(shù)據(jù)有所區(qū)別,咱們分別說明,前三點(diǎn)是從讀取數(shù)據(jù)庫到顯示在網(wǎng)頁,后三點(diǎn)是從網(wǎng)頁輸入數(shù)據(jù)到存入數(shù)據(jù)庫),第七到第九點(diǎn)針對純Java的類文件。 以下rs表示ResultSet的一個實(shí)例,是執(zhí)行Select語句之后產(chǎn)生的數(shù)據(jù)集。

    一、數(shù)據(jù)庫連接方式使用UTF-8

    在連接數(shù)據(jù)庫的驅(qū)動后面加上這句參數(shù)useUnicode=true&characterEncoding=

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

    true&characterEncoding=UTF-8,從數(shù)據(jù)庫里讀出中文顯示在使用GBK的JSP的網(wǎng)頁里,如果數(shù)據(jù)庫里存放的字體編碼是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正確顯示中文。如果數(shù)據(jù)庫里存放的是GBK數(shù)據(jù),那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")來顯示正確的中文。值得注意的是如果頁面使用UTF-8,數(shù)據(jù)庫里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正確顯示中文。如果網(wǎng)頁是UTF-8,而數(shù)據(jù)庫里存放的是GBK,無法直接顯示中文,需要2步轉(zhuǎn)換, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正確顯示中文。

    二、數(shù)據(jù)庫連接方式使用GBK

    在連接數(shù)據(jù)庫的驅(qū)動后面加上這句參數(shù)useUnicode=true&characterEncoding=

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

    characterEncoding=GBK,從數(shù)據(jù)庫里讀出中文,顯示在使用GBK的JSP的網(wǎng)頁里,如果數(shù)據(jù)庫里存放的字體編碼是UTF-8,在JSP中一定要使用 str=new String(rs.getBytes(1),"UTF-8"),才正確顯示中文。如果數(shù)據(jù)庫里存放的是GBK數(shù)據(jù),那么JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1),即可顯示正確的中文。 如果網(wǎng)頁是UTF-8,而數(shù)據(jù)庫里存放的是GBK,只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法來顯示中文; 如果網(wǎng)頁是UTF-8,而數(shù)據(jù)庫里存放的是UTF-8,可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法來顯示中文。

    三、使用缺省數(shù)據(jù)庫連接方式

    連接數(shù)據(jù)庫的驅(qū)動后面沒有這句參數(shù)useUnicode=&characterEncoding=,例如jdbc:mysql://localhost/DBVF?autoReconnect=true,沒有參數(shù)useUnicode=true&characterEncoding,表示使用默認(rèn)的ISO-8895-1編碼。

    1. 從數(shù)據(jù)庫里讀出中文,顯示在GBK的網(wǎng)頁里。如果數(shù)據(jù)庫里存放的字體編碼是UTF-8,在JSP網(wǎng)頁中一定要使用語句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"),才可正確顯示中文。如果數(shù)據(jù)庫里存放的是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)頁是UTF-8,不能直接正確顯示GBK,需要2步轉(zhuǎn)換,str=new String(rs.getBytes(1),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK") 才可以正確顯示中文。如果數(shù)據(jù)庫里存的是UTF-8,直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就可以顯示中文了。

    以上是讀取數(shù)據(jù)庫里中文正確顯示在網(wǎng)頁上,下面三點(diǎn)是如何正確存入數(shù)據(jù)庫。

    四、數(shù)據(jù)庫連接方式使用UTF-8編碼

    JSP中要把網(wǎng)頁輸入的中文存入數(shù)據(jù)庫,通常有一個提交(Submit)的過程,是用str=request.getParameter("username"),然后執(zhí)行update或者insert語句來存入數(shù)據(jù)庫。如何賦值給str很重要,而且這里中文輸入與網(wǎng)頁所使用的字體編碼有關(guān)。

    1、 網(wǎng)頁使用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ù)庫里的數(shù)據(jù)是UTF-8編碼。

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

    3. 值得注意的是使用UTF-8的數(shù)據(jù)庫連接方式不能存得GBK。

    五、數(shù)據(jù)庫連接方式使用GBK編碼

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

    2. 網(wǎng)頁使用GBK,想存入UTF-8到數(shù)據(jù)庫里,要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK")即可。

    3. 網(wǎng)頁使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),那么存到數(shù)據(jù)庫里的數(shù)據(jù)是UTF-8編碼。

    4. 網(wǎng)頁使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"),那么存到數(shù)據(jù)庫里的數(shù)據(jù)是GBK編碼。

    六、數(shù)據(jù)庫連接方式使用缺省,即不使用參數(shù)useUnicode和characterEncoding

    1. 網(wǎng)頁使用GBK,如果使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes()),那么在數(shù)據(jù)庫里的數(shù)據(jù)是GBK碼。網(wǎng)頁使用UTF-8 和使用str= request.getParameter("username"),則存入數(shù)據(jù)庫是UTF-8編碼。

    2. 如果使用str= new String(request.getParameter("username").getBytes("ISO-8859-1")),那么根據(jù)網(wǎng)頁提供的字體編碼而存到數(shù)據(jù)庫里,比如是UTF-8的網(wǎng)頁,那么存到數(shù)據(jù)庫中就是UTF-8編碼,如果使用GBK網(wǎng)頁,那么存到數(shù)據(jù)庫里的字就是GBK編碼。

    3. 如果使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")這一種組合能存到正確的數(shù)據(jù)外,其他存到數(shù)據(jù)庫里的數(shù)據(jù)則都是亂碼或者錯誤碼。在這個UTF-8組合的特例中,網(wǎng)頁使用的是GBK,則存放到數(shù)據(jù)庫里就是GBK,網(wǎng)頁使用UTF-8,那么存到數(shù)據(jù)庫里的就是UTF-8。

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

    5. 網(wǎng)頁是UTF-8的,不能存得GBK在數(shù)據(jù)庫里,一句話,改變數(shù)據(jù)庫連接方式不能存得GBK碼。

    以上所有的都是基于JSP網(wǎng)頁和數(shù)據(jù)庫交換數(shù)據(jù),下面討論一下純JAVA編程下的字體編碼轉(zhuǎn)換。

    七、數(shù)據(jù)庫連接方式使用UTF-8編碼

    1. 數(shù)據(jù)庫里的中文是UTF-8,可以轉(zhuǎn)換為GBK,但不能把GBK存入數(shù)據(jù)庫。

    2. 數(shù)據(jù)庫是GBK,如果轉(zhuǎn)換為UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接將content存入數(shù)據(jù)庫就可為UTF-8。

    八、數(shù)據(jù)庫連接方式使用GBK編碼

    1. 數(shù)據(jù)庫里的中文是UTF-8,如果轉(zhuǎn)換為GBK,使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert語句插入到數(shù)據(jù)庫,即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes()),再存入數(shù)據(jù)庫即存得還是UTF-8編碼。

    2. 數(shù)據(jù)庫里的中文是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語句插入到數(shù)據(jù)庫,即存得UTF-8。

    3. 如果某個String是GBK,要轉(zhuǎn)換為UTF-8,也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 如果某個String是UTF-8,要轉(zhuǎn)換為GBK,應(yīng)該使用new String(UTFstr.getBytes("GBK"),"UTF-8")。

    九、數(shù)據(jù)庫連接方式使用缺省,即不跟參數(shù)

    1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"),可以將數(shù)據(jù)庫里的GBK編碼轉(zhuǎn)換為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. 不能實(shí)現(xiàn)數(shù)據(jù)庫里的UTF-8轉(zhuǎn)換為GBK。

    如果采用UTF-8的數(shù)據(jù)庫連接方式或者缺省數(shù)據(jù)連接方式,那么無法將UTF-8轉(zhuǎn)為GBK;而GBK的數(shù)據(jù)庫連接方式可以實(shí)現(xiàn)UTF-8和GBK的相互轉(zhuǎn)換。建議大家采用GBK的數(shù)據(jù)連接方式。



    |----------------------------------------------------------------------------------------|
                               版權(quán)聲明  版權(quán)所有 @zhyiwww
                引用請注明來源 http://m.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2006-07-11 17:33 zhyiwww 閱讀(627) 評論(0)  編輯  收藏 所屬分類: j2ee
    主站蜘蛛池模板: AV在线亚洲男人的天堂| 无码国产精品一区二区免费式影视 | 亚洲国产美女精品久久久久| 一级一片免费视频播放| 国产在线19禁免费观看国产| 亚洲欧洲日本精品| 免费观看激色视频网站(性色) | 国产情侣激情在线视频免费看| 成人无码区免费A片视频WWW| 四虎AV永久在线精品免费观看| 亚洲国产品综合人成综合网站| 久久国产乱子伦精品免费看| 久久久亚洲精品蜜桃臀| 好湿好大好紧好爽免费视频| 亚洲成av人片一区二区三区| 色多多www视频在线观看免费| 永久免费看bbb| 青青免费在线视频| 亚洲综合图色40p| 久久一本岛在免费线观看2020| 亚洲国产精品无码久久久不卡| 无码精品国产一区二区三区免费| 亚洲精品无码精品mV在线观看| 久久精品免费电影| 香蕉大伊亚洲人在线观看| 国产特级淫片免费看| 亚欧国产一级在线免费| 亚洲av激情无码专区在线播放| 在线观看免费人成视频色9| 亚洲av色香蕉一区二区三区蜜桃| 亚洲av区一区二区三| 成人电影在线免费观看| 亚洲一本到无码av中文字幕| 亚洲国产V高清在线观看| 久久久久久一品道精品免费看| 亚洲国产成人精品激情| 亚洲色中文字幕无码AV| 免费看香港一级毛片 | a毛片免费观看完整| 亚洲一区二区三区在线网站| 国产亚洲精品福利在线无卡一|