getBytes()詳解

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

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

將返回"中"這個漢字分別在gbk、utf-八、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_utf八、s_iso88591能夠看到,s_gbk和s_utf8都是"中",而s_iso88591是一個亂碼,這是由於iso-8859-1的編碼表中,根本就沒有包含漢字,所以"中".getBytes("iso-8859-1")獲得的是"?"的字節數組表示,再經過new String(b_iso88591, "iso-8858-1")還原獲得的是"?"。spa

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

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

這樣獲得的字符串s_iso88591其實是三個在iso-8859-1中的字符,在將這些字符傳送到目的地後,再經過相反的方式,即:code

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

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

 

注:內存

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爲例,換成二進制即爲:utf-8

1110 0100字符串

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

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

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

相關文章
相關標籤/搜索