system.out.print("中文")只要编译的时候正确的使用了编码,jvm中都用utf16存储的字符,那么输出的时候,还是会转化为字节数组的,那输出到console的时候,输出的是什么编码呢?与console的编码方式有关还是-Dfile.encoding有关呢?我试了和-Dfile.encoding好像没关系
system.out.print("中文")只要编译的时候正确的使用了编码,jvm中都用utf16存储的字符,那么输出的时候,还是会转化为字节数组的,那输出到console的时候,输出的是什么编码呢?与console的编码方式有关还是-Dfile.encoding有关呢?我试了和-Dfile.encoding好像没关系
用IDE追一下源代码就知道了,其实是不对String对象做任何的编码转换处理,用的是s.getChar()
方法直接将String转化为字符数组之后打印到终端上的。所以你的字符编码是什么那么打印的是什么。
至于终端展示的时候自然是终端自己处理编码了,你的终端设置成什么编码对应的就是什么编码解析。
你用一些能改终端编码的终端模拟器试试就知道了,比如cygwin或者mingw终端模拟器,默认的UTF8编码在windows下可能就乱码,改成CP936编码java输出就正常
3 回答2.6k 阅读✓ 已解决
3 回答4.1k 阅读✓ 已解决
8 回答3.8k 阅读
4 回答2.8k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答2.6k 阅读✓ 已解决
4 回答1.9k 阅读
输出一下Charset.defaultCharset()
获取运行时的默认编码(一般是UTF-8
或GBK
,受环境影响,如操作系统/开发工具/控制台编码设置)标准输出流编码不是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
中文常用编码如果运行时能正确输出中文,说明输出编码和文件编码一致