JAVA字元編碼系列二:Unicode,ISO-8859,GBK,UTF-8編碼及相互轉換

來源:互聯網
上載者:User
第二篇:JAVA字元編碼系列二:Unicode,ISO-8859-1,GBK,UTF-8編碼及相互轉換  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測試結果如下,每個漢字轉換為兩個位元組,且是可逆的,即通過位元組可以轉換回字串String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文) 2)Unicode和UTF-8測試結果如下,每個漢字轉換為三個位元組,且是可逆的,即通過位元組可以轉換回字串String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文)3)Unicode和ISO-8859-1測試結果如下,當存在漢字時轉換失敗,非可逆,即通過位元組不能再轉換回字串String-ISO-8859-1〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F 0x3FByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉\u0061\u003F\u003F(a??) 3、Unicode與各編碼之間的交叉轉換在上面直接轉換中,由字串(Unicode)產生的位元組數組,在構造回字串時,使用的是正確的編碼集合,如果使用的不是正確的編碼集合會怎樣呢?會正確構造嗎?如果不能正確構造能有辦法恢複嗎?會資訊丟失嗎? 下面我們就來看看這種情況,這部分可以說明在某些情況下雖然我們最終正確顯示了結果,但其間仍然進行了不正確的轉換。 1)能夠正確顯示的中間不正確轉換我們知道String-GBK〉ByteArray-GBK〉String是正確的,但如果我們採用String-GBK〉ByteArray-ISO-8859-1〉String呢?通過測試結果如下:String-GBK〉ByteArray-ISO-8859-1〉String:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????) 這時我們得到的字串為?亂碼“a????”,但是通過繼續轉換我們仍然可以複原回正確的字串“a中文”,過程如下:String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String對應:\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頁面提交資料處理時常常發生這種情況。 此外能夠正確顯示的中間不正確轉換還有:String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String和String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String對應:\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涓枃。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.