设置缺省 Java 字符编码

2022-08-31 04:39:36

如何以编程方式正确设置 JVM (1.5.x) 使用的缺省字符编码?

我读过,这曾经是旧JVM的方式。我没有那么奢侈,因为我不会进入的原因。-Dfile.encoding=whatever

我试过:

System.setProperty("file.encoding", "UTF-8");

并且该属性已设置,但它似乎不会导致下面的最终调用使用 UTF8:getBytes

System.setProperty("file.encoding", "UTF-8");

byte inbytes[] = new byte[1024];

FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
FileOutputStream fos = new FileOutputStream("response-2.txt");
String in = new String(inbytes, "UTF8");
fos.write(in.getBytes());

答案 1

不幸的是,该属性必须在JVM启动时指定;在输入 main 方法时,使用的字符编码和 的默认构造函数已被永久缓存。file.encodingString.getBytes()InputStreamReaderOutputStreamWriter

正如 Edward Grech 所指出的,在像这样的特殊情况下,环境变量可用于指定此属性,但通常如下所示:JAVA_TOOL_OPTIONS

java -Dfile.encoding=UTF-8 … com.x.Main

Charset.defaultCharset()将反映对属性的更改,但核心 Java 库中需要确定缺省字符编码的大多数代码都不使用此机制。file.encoding

编码或解码时,可以查询属性或查找当前默认编码,并使用适当的方法或构造函数重载来指定它。file.encodingCharset.defaultCharset()


答案 2

JVM™ 工具接口文档中...

由于无法始终访问或修改命令行(例如,在嵌入式 VM 中或只是在脚本中深处启动的 VM 中),因此提供了一个变量,以便在这些情况下可以启动代理。JAVA_TOOL_OPTIONS

通过将 (Windows) 环境变量设置为 ,每次启动 JVM 时都会自动设置 (Java) 属性。您将知道该参数已被选取,因为以下消息将被发布到:JAVA_TOOL_OPTIONS-Dfile.encoding=UTF8SystemSystem.err

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8


推荐