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

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

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

    天下難事,必作于易;天下大事,必作于細
    如果我有方向,那就是遠方
    posts - 11,comments - 8,trackbacks - 0
    1、函數介紹
    在Java中,字符串用統一的Unicode編碼,每個字符占用兩個字節,與編碼有關的兩個主要函數為:
    1)將字符串用指定的編碼集合解析成字節數組,完成Unicode-〉charsetName轉換
    public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 
    ?
    2)將字節數組以指定的編碼集合構造成字符串,完成charsetName-〉Unicode轉換
    public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException
    ?
    2、Unicode與各編碼之間的直接轉換
    下面以對中文字符串"a中文"的編碼轉換為例,來了解各種編碼之間的轉換
    1)Unicode和GBK
    測試結果如下,每個漢字轉換為兩個字節,且是可逆的,即通過字節可以轉換回字符串
    StringGBKByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4
    ByteArrayGBKString:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)
    ?
    2)Unicode和UTF-8
    測試結果如下,每個漢字轉換為三個字節,且是可逆的,即通過字節可以轉換回字符串
    StringUTF-8ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87
    ByteArrayUTF-8String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文)
    3)Unicode和ISO-8859-1
    測試結果如下,當存在漢字時轉換失敗,非可逆,即通過字節不能再轉換回字符串
    StringISO-8859-1ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F 0x3F
    ByteArrayISO-8859-1String:0x61 0x3F 0x3F-〉\u0061\u003F\u003F(a??)
    3、Unicode與各編碼之間的交叉轉換
    在上面直接轉換中,由字符串(Unicode)生成的字節數組,在構造回字符串時,使用的是正確的編碼集合,如果使用的不是正確的編碼集合會怎樣呢?會正確構造嗎?如果不能正確構造能有辦法恢復嗎?會信息丟失嗎?
    ?
    下面我們就來看看這種情況,這部分可以說明在某些情況下雖然我們最終正確顯示了結果,但其間仍然進行了不正確的轉換。
    ?
    1)能夠正確顯示的中間不正確轉換
    我們知道StringGBKByteArrayGBKString是正確的,但如果我們采用StringGBKByteArrayISO-8859-1String呢?通過測試結果如下:
    StringGBKByteArrayISO-8859-1String:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????)
    ?
    這時我們得到的字符串為?亂碼“a????”,但是通過繼續轉換我們仍然可以復原回正確的字符串“a中文”,過程如下:
    StringGBKByteArrayISO-8859-1StringISO-8859-1ByteArrayGBKString
    對應:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)
    ?
    也就是我們在首次構造字符串時,我們用了錯誤的編碼集合得到了錯誤的亂碼,但是我們通過錯上加錯,再用錯誤的編碼集合獲取字節數組,然后再用正確的編碼集合構造,就又恢復了正確的字符串。這時就屬于是“能夠正確顯示的中間不正確轉換”。在Jsp頁面提交數據處理時常常發生這種情況。
    ?
    此外能夠正確顯示的中間不正確轉換還有:
    StringUTF-8ByteArrayISO-8859-1StringISO-8859-1ByteArrayUTF-8String
    StringUTF-8ByteArrayGBKStringGBKByteArrayUTF-8String
    對應:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u6D93\uE15F\u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文)
    ?
    4、編碼過程中錯誤診斷參考
    1)一個漢字對應一個問號
    在通過ISO-8859-1從字符串獲取字節數組時,由于一個Unicode轉換成一個byte,當遇到不認識的Unicode時,轉換為0x3F,這樣無論用哪種編碼構造時都會產生一個?亂碼。
    2)一個漢字對應兩個問號
    在通過GBK從字符串獲取字節數組時,由于一個Unicode轉換成兩個byte,如果此時用ISO-8859-1或用UTF-8構造字符串就會出現兩個問號。
    若是通過ISO-8859-1構造可以再通過上面所說的錯上加錯恢復(即再通過從ISO-8859-1解析,用GBK構造);
    若是通過UTF-8構造則會產生Unicode字符"\uFFFD",不能恢復,若再通過String-UTF-8〉ByteArray-GBK〉String,則會出現雜碼,如a錕斤拷錕斤拷
    3)一個漢字對應三個問號
    在通過UTF-8從字符串獲取字節數組時,由于一個Unicode轉換成三個byte,如果此時用ISO-8859-1構造字符串就會出現三個問號;用GBK構造字符串就會出現雜碼,如a涓枃。
    posted on 2007-12-04 14:57 flyepp 閱讀(7520) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 青青草免费在线视频| 99视频精品全部免费观看| 亚洲youwu永久无码精品| 亚洲人成人77777在线播放| 亚洲乱码卡三乱码新区| 97视频免费观看2区| 亚洲欧洲日产国产综合网| 亚洲中文字幕久久精品无码2021| 亚洲一区二区三区高清不卡| 免费一级做a爰片久久毛片潮| 国产无遮挡色视频免费观看性色| 久久精品国产免费观看| 国产成人免费a在线资源| 国产偷v国产偷v亚洲高清| 亚洲人成网站色在线观看| 黄视频在线观看免费| 亚洲色偷偷狠狠综合网| 亚洲成在人线电影天堂色| 黄页免费视频播放在线播放| 99精品视频在线观看免费播放| 亚洲AV人无码激艳猛片| 在线看亚洲十八禁网站| AV大片在线无码永久免费| 久久国产成人亚洲精品影院 | 午夜寂寞在线一级观看免费| 亚洲国产人成中文幕一级二级| 亚洲欧洲日产国码www| 噼里啪啦电影在线观看免费高清| 亚洲av无码专区在线观看亚| 97人妻无码一区二区精品免费| 亚洲 日韩 色 图网站| 免费在线精品视频| 亚洲色大成网站www永久网站| 精品一区二区三区无码免费视频 | 朝桐光亚洲专区在线中文字幕| 久久久久久久免费视频| 亚洲精品在线播放| 在线看无码的免费网站| 亚洲国产成人精品无码区花野真一| 亚洲一区精品伊人久久伊人| 中文字幕在线观看免费视频|