關於String的getBytes(),getBytes(encoding)和new String(bytes, encoding)這三個方法的學習總結

關於String的getBytes(),getBytes(encoding)和new String(bytes, encoding)這三個方法,非常值得注意:

A.getBytes():使用平臺默認的編碼方式(通過file.encoding屬性獲取)方式來將字符串轉換成byte[]。得到的是字符串最原始的字節編碼值。

 

B.getBytes(NAME_OF_CHARSET):使用指定的編碼方式將字符串轉換成byte[],如果想要得到正確的字節數組,程序員必須給出正確的NAME_OF_CHARSET。否則得到的就不會得到正確的結果。

 

C.new String(bytes, encoding):如果我們在客戶端使用UTF-8編碼的JSP頁面發出請求,瀏覽器編碼後的UTF-8字節會以ISO-8859-1的形式傳遞到服務器端。所以要得到經HTTP協議傳輸的原始字節,我們需要先調用getBytes("ISO-8859-1")得到原始的字節,但由於我們客戶端的原始編碼是UTF-8,如果繼續按照ISO-8859-1解碼,那麼得到的將不是一箇中文字符,而是3個亂碼的字符。所以我們需要再次調用new String(bytes,"UTF-8"),將字節數組按照UTF-8的格式,每3個一組進行解碼,才能還原爲客戶端的原始字符。


編碼方式:

1、JVM中單個字符佔用的字節長度跟編碼方式有關,而默認編碼方式又跟平臺是一一對應的或說平臺決定了默認字符編碼方式;

 

2、對於單個字符:ISO-8859-1單字節編碼,GBK雙字節編碼,UTF-8三字節編碼;因此中文平臺(中文平臺默認字符集編碼GBK)下一個中文字符佔2個字節,而英文平臺(英文平臺默認字符集編碼Cp1252(類似於ISO-8859-1))。

 

3、getBytes()、getBytes(encoding)函數的作用是使用系統默認或者指定的字符集編碼方式,將字符串編碼成字節數組。

 

編碼方式決定字節長度;在中文平臺下,默認的字符集編碼是GBK,此時如果使用getBytes()或getBytes("GBK"),則按照GBK的編碼規則將每個中文字符用2個byte表示。所以我們看到"中文"最終GBK編碼結果就是: -42 -48 -50 -60 。-42和-48代表了"中"字,而"-50"和"-60"則代表了"文"字。

 

在中文平臺下,如果指定的字符集編碼是UTF-8,那麼按照UTF-8對中文的編碼規則:每個中文用3個字節表示,那麼"中文"這兩個字符最終被編碼成:-28 -72 -83、-26 -106 -121兩組。每3個字節代表一箇中文字符。

 

在中文平臺下,如果指定的字符集編碼是ISO-8859-1,由於此字符集是單字節編碼,所以使用getBytes("ISO-8859-1")時,每個字符只取一個字節,每個漢字只取到了一半的字符。另外一半的字節丟失了。由於這一半的字符在字符集中找不到對應的字符,所以默認使用編碼63代替,也就是?。

 

在英文平臺下,默認的字符集編碼是Cp1252(類似於ISO-8859-1),如果使用GBK、UTF-8進行編碼,得到的字節數組依然是正確的(GBK4個字節,UTF-8是6個字節)。因爲在JVM內部是以Unicode存儲字符串的,使用getBytes(encoding)會讓JVM進行一次Unicode到指定編碼之間的轉換。對於GBK,JVM依然會轉換成4個字節,對於UTF-8,JVM依然會轉換成6個字節。但是對於ISO-8859-1,則由於無法轉換(2個字節--->1個字節,截取了一半的字節),所以轉換後的結果是錯誤的。





發佈了15 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章