編碼總結一:Java默認字符集


(一)JVM默認字符集——Charset.defaultCharset()

獲取Java虛擬機默認字符集,該字符集默認跟操作系統字符集一致,也可以通過-Dfile.encoding="GBK" 來手動設定,但是在程序中通過setProperty方法直接設置並不能改變該方法的返回值。查看或修改操作系統默認字符集請參考下面2篇文章。

查看windows 系統字符集

如何查看和修改操作系統字符集

Java中,字符字節轉換時,如果不提供字符集,使用默認字符集。例如,字符串和字節數組轉換時,字節流和字符流轉換時等。

 

 1 String str = "中文";
 2         // 獲取JVM默認字符集
 3         System.out.println("defaultCharset:" + Charset.defaultCharset());
 4 
 5         System.out.println("##字符串轉換成byte數組");
 6         byte[] defaultByteArray = str.getBytes();
 7         byte[] gbkByteArray = str.getBytes("GBK");
 8         byte[] utfByteArray = str.getBytes("UTF-8");
 9         System.out.println("defaultByteArray:"
10                 + Arrays.toString(defaultByteArray));
11         System.out.println("gbkByteArray:" + Arrays.toString(gbkByteArray));
12         System.out.println("utfByteArray:" + Arrays.toString(utfByteArray));
13 
14         System.out.println("##byte數組轉換成字符串");
15         String defaultStr = new String(defaultByteArray);
16         String gbkStr = new String(defaultByteArray, "GBK");
17         String utfStr = new String(defaultByteArray, "UTF-8");
18         System.out.println("defaultStr:" + defaultStr);
19         System.out.println("gbkStr:" + gbkStr);
20         // 因為utf-8是變長編碼,沒有跟[-42, -48, -50, -60]對應的用utf-8字符集的字符串,所以會亂碼
21         System.out.println("utfStr:" + utfStr);
22 
23         System.out.println("##字節流轉化成字符流");
24         // 文件中只有“中文”2個字,文件采用“GBK”編碼,共4個byte
25         BufferedReader defaultReader = new BufferedReader(
26                 new InputStreamReader(new FileInputStream("src/encode.txt")));
27         BufferedReader gbkReader = new BufferedReader(new InputStreamReader(
28                 new FileInputStream("src/encode.txt"), "GBK"));
29         BufferedReader utfReader = new BufferedReader(new InputStreamReader(
30                 new FileInputStream("src/encode.txt"), "UTF-8"));
31         System.out.println("defaultReader:" + defaultReader.readLine());
32         System.out.println("gbkReader:" + gbkReader.readLine());
33         System.out.println("utfReader:" + utfReader.readLine());
34 
35         System.out.println("##字符流轉化成字節流");
36         BufferedWriter defaultWriter = new BufferedWriter(
37                 new OutputStreamWriter(System.out));
38         BufferedWriter gbkWriter = new BufferedWriter(new OutputStreamWriter(
39                 System.out, "GBK"));
40         BufferedWriter utfWriter = new BufferedWriter(new OutputStreamWriter(
41                 System.out, "UTF-8"));
42         System.out.print("defaultWriter:");
43         defaultWriter.write(str);
44         // 這里不能用close()方法,否則System.out也被關閉,后續無輸出
45         defaultWriter.flush();
46         System.out.print("\r\ngbkReader:");
47         gbkWriter.write(str);
48         gbkWriter.flush();
49         System.out.print("\r\nutfReader:");
50         utfWriter.write(str);
51         utfWriter.flush();
Java

defaultCharset:GBK
##字符串轉換成byte數組
defaultByteArray:[-42, -48, -50, -60]
gbkByteArray:[-42, -48, -50, -60]
utfByteArray:[-28, -72, -83, -26, -106, -121]
##byte數組轉換成字符串
defaultStr:中文
gbkStr:中文
utfStr:????
##字節流轉化成字符流
defaultReader:中文
gbkReader:中文
utfReader:????
##字符流轉化成字節流
defaultWriter:中文
gbkReader:中文
utfReader:涓枃

二)Java程序入口文件(main函數所在文件)編碼——System.getProperty("file.encoding")

該編碼默認值取決於Java程序入口文件(main函數所在文件)編碼的編碼方式,具體請參考下面文章,也可以在運行Java程序時通過-Dfile.encoding="GBK" 來設定,如果-Dfile.encoding指定的編碼方式跟Java程序入口文件的字符集不一致,將會導致亂碼。也可以在程序中通過setProperty方法直接設置,這種設置雖然改變了“file.encoding”的值,但是似乎沒什么用

java 中關於System property 之 file.encoding

 

 1 System.out.println("##文件編碼是GBK,-Dfile.encoding=\"GBK\"");
 2         System.out.println("file.encoding:"
 3                 + System.getProperty("file.encoding"));
 4         // 在不存在的目錄下創建文件,查看報錯信息
 5         try {
 6             new File("directory/test.txt").createNewFile();
 7         } catch (IOException e) {
 8             e.printStackTrace();
 9         }
10 
11         // ##文件編碼是GBK,-Dfile.encoding="UTF-8"
12         System.out.println("##文件編碼是GBK,-Dfile.encoding=\"UTF-8\"");
13         System.out.println("file.encoding:"
14                 + System.getProperty("file.encoding"));
15         // 在不存在的目錄下創建文件,查看報錯信息
16         try {
17             new File("directory/test.txt").createNewFile();
18         } catch (IOException e) {
19             e.printStackTrace();
20         }
Java

##文件編碼是GBK,-Dfile.encoding="GBK"
file.encoding:GBK
java.io.IOException: 系統找不到指定的路徑。
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:883)
 at Encoding.main(Encoding.java:72)

##鏂囦歡緙栫爜鏄疓BK,-Dfile.encoding="UTF-8"
file.encoding:UTF-8
java.io.IOException: 緋葷粺鎵句笉鍒版寚瀹氱殑璺緞銆?
 at java.io.WinNTFileSystem.createFileExclusively(Native Method)
 at java.io.File.createNewFile(File.java:883)
 at Encoding.main(Encoding.java:83)

 

(三)文件名字編碼——System.getProperty("sun.jnu.encoding")

有關這個的說明較少,未作深入研究,請參考下面兩篇文章。

Java Platform Encoding

Java 的系統屬性 sun.jnu.encoding 和 file.encoding 的區別 


免責聲明!

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



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