天天看點

java編碼問題

public static final Charset DEFAULT_CHARSET = Charset.forName(”UTF-8”)什麼意思

定義一個預設字元集變量:DEFAULT_CHARSET

并指派為: utf-8類型的字元集

并且此變量為 公共的靜态和最終态變量,

即此變量不能再次指派,靜态(static)的意思是說,無論此變量所在類有多少對象,此變量隻有一個,是屬于此類的變量,隻占一處堆棧空間。

在Java中,String的getBytes()方法是得到一個作業系統預設的編碼格式的位元組數組。這個表示在不通OS下,傳回的東西不一樣!

String.getBytes(String decode)方法會根據指定的decode編碼傳回某字元串在該編碼下的byte數組表示,如

byte[] b_gbk = “中”.getBytes(“GBK”);

byte[] b_utf8 = “中”.getBytes(“UTF-8”);

byte[] b_iso88591 = “中”.getBytes(“ISO8859-1”);

将分别傳回“中”這個漢字在GBK、UTF-8和ISO8859-1編碼下的byte數組表示,此時b_gbk的長度為2,b_utf8的長度為3,b_iso88591的長度為1。

而與getBytes相對的,可以通過new String(byte[], decode)的方式來還原這個“中”字時,這個new String(byte[], decode)實際是使用decode指定的編碼來将byte[]解析成字元串。

String s_gbk = new String(b_gbk,”GBK”);

String s_utf8 = new String(b_utf8,”UTF-8”);

String s_iso88591 = new String(b_iso88591,”ISO8859-1”);

通過列印s_gbk、s_utf8和s_iso88591,會發現,s_gbk和s_utf8都是“中”,而隻有s_iso88591是一個不認識的字元,為什麼使用ISO8859-1編碼再組合之後,無法還原“中”字呢,其實原因很簡單,因為ISO8859-1編碼的編碼表中,根本就沒有包含漢字字元,當然也就無法通過”中”.getBytes(“ISO8859-1”);來得到正确的“中”字在ISO8859-1中的編碼值了,是以再通過new String()來還原就無從談起了。

是以,通過String.getBytes(String decode)方法來得到byte[]時,一定要确定decode的編碼表中确實存在String表示的碼值,這樣得到的byte[]數組才能正确被還原。

有時候,為了讓中文字元适應某些特殊要求(如http header頭要求其内容必須為iso8859-1編碼),可能會通過将中文字元按照位元組方式來編碼的情況,如

String s_iso88591 = new String(“中”.getBytes(“UTF-8”),”ISO8859-1”),

這樣得到的s_iso8859-1字元串實際是三個在 ISO8859-1中的字元,在将這些字元傳遞到目的地後,

目的地程式再通過相反的方式String s_utf8 = new String(s_iso88591.getBytes(“ISO8859-1”),”UTF-8”)來得到正确的中文漢字“中”。這樣就既保證了遵守協定規定、也支援中文。

來個網上的截圖資料

java編碼問題

幾點心得:

1)String類始終是以Unicode編碼形式存儲.

2)注意String.getBytes()的使用:

如果不帶字元集參數,就會依賴于JVM的字元集編碼,LINUX上一般為UNICODE,WINDOWS下一般為GBK.(要想改變JVM預設字元集編碼,啟動JVM時用選項-Dfile.encodeing=UTF-8.

為了安全起見,建議始終帶參數調用,例如:String s ; s.getBytes(“UTF-8”)。

3)Charset類非常好用,

Charset.encode 是編碼,即把String按你指定的字元集編碼格式進行編碼後輸出位元組數組。

Charset.decode 是解碼,即把一個位元組數組按你指定的字元集編碼格式進行解碼後輸出成字元串。

舉例如下: