java 系统默认字符集_编码总结一:Java默认字符集

本文详细探讨了Java的默认字符集,包括JVM默认字符集、Java程序入口文件编码以及文件名字编码。通过示例展示了如何获取和设置默认字符集,并分析了不同编码方式在字符串与字节数组转换、字节流与字符流转换中的应用,强调了正确设置字符集的重要性。
摘要由CSDN通过智能技术生成

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

获取Java虚拟机默认字符集,该字符集默认跟操作系统字符集一致,也可以通过-Dfile.encoding="GBK" 来手动设定,但是在程序中通过setProperty方法直接设置并不能改变该方法的返回值。查看或修改操作系统默认字符集请参考下面2篇文章。

Java中,字符字节转换时,如果不提供字符集,使用默认字符集。例如,字符串和字节数组转换时,字节流和字符流转换时等。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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 = newString(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 = newBufferedReader(26 new InputStreamReader(new FileInputStream("src/encode.txt")));27 BufferedReader gbkReader = new BufferedReader(newInputStreamReader(28 new FileInputStream("src/encode.txt"), "GBK"));29 BufferedReader utfReader = new BufferedReader(newInputStreamReader(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 = newBufferedWriter(37 newOutputStreamWriter(System.out));38 BufferedWriter gbkWriter = new BufferedWriter(newOutputStreamWriter(39 System.out, "GBK"));40 BufferedWriter utfWriter = new BufferedWriter(newOutputStreamWriter(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”的值,但是似乎没什么用。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

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")

有关这个的说明较少,未作深入研究,请参考下面两篇文章。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值