getBytes()詳解


在java中,getBytes()方法如果不指定字符集,則得到的是一個操作系統默認的編碼格式的字節數組;如果指定字符集,則得到的是在指定字符集下的字節數組,如:

byte[] b_gbk = "中".getBytes("gbk");
byte[] b_utf8 = "中".getBytes("utf-8");
byte[] b_iso88591 = "中".getBytes("iso-8859-1");

將返回"中"這個漢字分別在gbk、utf-8、iso-8859-1編碼下的字節數組表示,此時b_gbk的長度為2,b_utf8的長度為3,b_iso88591的長度為1。

與getBytes()方法相反,可以通過new String(byte[], charsetName)方法用指定的字符集來還原這個"中"字,如:

String s_gbk = new String(b_gbk, "gbk");
String s_utf8 = new String(b_utf8, "utf-8");
String s_iso88591 = new String(b_iso88591, "iso-8859-1");

通過打印出s_gbk、s_utf8、s_iso88591可以看到,s_gbk和s_utf8都是"中",而s_iso88591是一個亂碼,這是因為iso-8859-1的編碼表中,根本就沒有包含漢字,因此"中".getBytes("iso-8859-1")得到的是"?"的字節數組表示,再通過new String(b_iso88591, "iso-8858-1")還原得到的是"?"。

有時候,為了讓中文字符適應某些特殊要求(如http header要求其內容必須是iso-8859-1編碼),可能會通過將中文字符按照字節方式來編碼的情況,如:

String s_iso88591 = new String("中".getBytes("utf-8"), "iso-8859-1");

這樣得到的字符串s_iso88591實際上是三個在iso-8859-1中的字符,在將這些字符傳送到目的地后,再通過相反的方式,即:

String s_utf8 = new String(s_iso88591.getBytes("iso-8859-1"), "utf-8");

從而得到正確的中文漢字"中",這樣就既保證了遵守協議規定,也支持了中文。

 

注:

byte[] b = "中".getBytes("utf-8");
for(int i=0; i<b.length; i++) {
  System.out.println(b[i]);
}

輸出-28 -72 -83是因為"中"的utf-8編碼為三個字節,分別是E4 B8 AD,以E4為例,換成二進制即為:

1110 0100

該二進制數將以補碼存儲在內存中,最高位被視為符號位,因此原碼是:

1110 0100(補碼) -> 1001 1011(反碼) -> 1001 1100(原碼)

即-(16+8+4)=-28


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM