Java虛擬機(JVM)默認字符集詳解


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 的歷史名稱既可以是它的規范名稱,也可以是它的某個別名。歷史名稱由 InputStreamReaderOutputStreamWriter 類的 getEncoding() 方法返回。 

Java 虛擬機的每個實例都有默認的 charset,它可能是也可能不是某個標准 charset。默認 charset 在虛擬機啟動時決定,通常根據語言環境和底層操作系統使用的 charset 來確定。


免責聲明!

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



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