system.out.print输出的是什么编码

system.out.print("中文")只要编译的时候正确的使用了编码,jvm中都用utf16存储的字符,那么输出的时候,还是会转化为字节数组的,那输出到console的时候,输出的是什么编码呢?与console的编码方式有关还是-Dfile.encoding有关呢?我试了和-Dfile.encoding好像没关系

阅读 3.6k
2 个回答

输出一下 Charset.defaultCharset() 获取运行时的默认编码(一般是 UTF-8GBK,受环境影响,如操作系统/开发工具/控制台编码设置)

标准输出流编码不是 file.encoding 而是 sun.stdout.encoding

标准输出流编码,如果 sun.stdout.encoding 有设置,就是 sun.stdout.encoding,否则才是 file.encoding

所以你的控制台应该是擅自设置了 sun.stdout.encoding 导致 file.encoding 失效
使用 java -XshowSettings:properties 查看一下设置,或者 System.out.println(System.getProperty("sun.stdout.encoding"))

可以执行 java -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=null ... 看看 file.encoding 是不是生效了

另外,Java 17 可以用 Console.charset() 获取标准流编码

参考:
Java 新特性 https://segmentfault.com/a/11...
JEP 400 https://openjdk.org/jeps/400

虽然编码很多种,但常用的就两种:

  • UTF-8 世界第一常用编码
  • GBK 中文常用编码

如果运行时能正确输出中文,说明输出编码和文件编码一致

用IDE追一下源代码就知道了,其实是不对String对象做任何的编码转换处理,用的是s.getChar()方法直接将String转化为字符数组之后打印到终端上的。所以你的字符编码是什么那么打印的是什么。

至于终端展示的时候自然是终端自己处理编码了,你的终端设置成什么编码对应的就是什么编码解析。

你用一些能改终端编码的终端模拟器试试就知道了,比如cygwin或者mingw终端模拟器,默认的UTF8编码在windows下可能就乱码,改成CP936编码java输出就正常

推荐问题
宣传栏