Java中對字符串等進行轉換字節數組時, 需要根據字符集編碼來進行轉換, 當不顯示的指定字符集編碼時(如: "測試".getBytes()), 會使用Charset.defaultCharset()獲取到的字符集編碼進行轉換!
相關代碼如下:

上面的代碼可以看出, 在JVM中defaultCharset()是在初始化階段被調用, 且只會初始化一次, 首先會取file.encoding指定的字符集, 如果取不到則使用系統默認字符集(如: windows下為GBK), 然后通過
取到的字符集名稱(csn)去獲取Charset對象, 如果能獲取到則將其設為defaultCharset, 如果取不到則將defaultCharset設置為UTF-8字符集, defaultCharset一旦被初始化后, 在JVM之后的運行過程中
就無法再進行更改, 比如在JVM啟動后在程序中使用properties.setProperty("file.encoding","UTF-8");也不會改變defaultCharset的值~~~
如果想指定defaultCharset的值, 則可以通過JVM啟動參數(-Dfile.encoding="UTF-8")來顯示的指定此JVM的字符集!!!
拓展內容:
Charset name屬性的命名規范如下:
- 大寫字母 'A' 到 'Z'('\u0041' 到 '\u005a'),
- 小寫字母 'a' 到 'z'('=pos; 到 ' apos;),
- 數字 '0' 到 '9'('\u0030' 到 '\u0039'),
- 短划線字符 '-'('\u002d',連詞符號),
- 句點字符 '.'('\u002e',句點),
- 冒號字符 ':'('\u003a',冒號),和
- 下划線字符 '_'('\u005f',下划線)。
Charset 名稱必須以字母或數字開頭。空字符串不是合法的 charset 名稱。Charset 名稱是大小寫不敏感的,也就是當比較 charset 名稱時總是忽略大小寫。
每個 charset 有一個規范名稱,也可能有一個或多個別名。規范名稱由此類的 name 方法返回。根據約定,規范名稱通常是大寫的。charset 的別名由 aliases 方法返回。
一些 charset 有一個歷史名稱,定義這個名稱是為了和以前版本的 Java 平台兼容。charset 的歷史名稱既可以是它的規范名稱,也可以是它的某個別名。歷史名稱由 InputStreamReader 和 OutputStreamWriter 類的 getEncoding() 方法返回。
Java 虛擬機的每個實例都有默認的 charset,它可能是也可能不是某個標准 charset。默認 charset 在虛擬機啟動時決定,通常根據語言環境和底層操作系統使用的 charset 來確定。
