java的默認編碼
java的默認編碼
比如String.getBytes()就調用的默認編碼,流程如下:
會先獲取默認編碼:String csn = Charset.defaultCharset().name();
如果默認編碼有異常則使用:"ISO-8859-1"
那麽默認編碼如何獲取?看了下源碼如下
The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.
默認字符集是在虛擬機啟動期間確定的,通常取決於底層操作系統的區域設置和字符集。
public static Charset defaultCharset() {
if (defaultCharset == null) {
synchronized (Charset.class) {
String csn = AccessController.doPrivileged(new GetPropertyAction("file.encoding"));//系統屬性file.encoding設置的編碼
Charset cs = lookup(csn);
if (cs != null)
else
defaultCharset = forName("UTF-8");//得不到系統設置的編碼則用UTF-8
}
}
return defaultCharset;
}
file.encoding 設置(運行時可設置):
在命令行中輸入 java,在給出的提示中會出現 -D 的說明:
-D= # set a system property
-D後面需要跟一個鍵值對,作用是設置一項系統屬性
對 -Dfile.encoding=UTF-8 來說就是設置系統屬性 file.encoding 為 UTF-8
java默認編碼理解總結:
先看file.encoding設置的編碼(eclipse運行時候,為了不亂碼會以文件編碼運行)
如果沒有設置的編碼則用"UTF-8"
如果設置的編碼不可用則用"ISO-8859-1"
註意點:
我們的電腦系統一般都是默認的GBK編碼,如果cmd命令編譯默認都用GBK。
編譯編碼(編譯用編碼和文件編碼一致,不然會編譯不通過,我猜可能是為了防止編譯亂碼):javac -encoding UTF-8 Test.java
運行編碼(也就是defaultCharset,java會程序用的默認編碼)java -Dfile.encoding=utf-8 Test
編譯編碼和運行編碼之間沒有必要聯系。編譯編碼(必須和文件一致,保證文件的正確編譯),執行編碼(為java程序(JRE)設定默認編碼)。這也是為什麽jar包裏的class代碼無論在什麽編碼下都可執行
在使用eclipse混合文件編碼時也可編譯執行,原因:個人認為eclipse等開發環境會默認使用文件編碼格式編譯,文件(程序入庫的文件)編碼格式運行(因為運行的是main()方法,main()可以多個,但程序入口就一個)
在服務器上運行時,不會和eclipse一樣自動設置,固最好配置執行編碼
java的默認編碼