1. 程式人生 > >java的默認編碼

java的默認編碼

static 鍵值 混合 test 異常 入庫 文件編碼 設定 原因

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)

defaultCharset = cs;
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的默認編碼