(一)JVM默认字符集——Charset.defaultCharset()
获取Java虚拟机默认字符集,该字符集默认跟操作系统字符集一致,也可以通过-Dfile.encoding="GBK" 来手动设定,但是在程序中通过setProperty方法直接设置并不能改变该方法的返回值。
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”的值,但是似乎没什么用。
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")