如何以编程方式正确设置JVM(1.5.x)使用的默认字符编码?
我已经读过-Dfile.encoding=whatever
以前用于旧JVM的方法......由于我不会进入的原因,我没有那么奢侈.
我试过了:
System.setProperty("file.encoding", "UTF-8");
并且属性已设置,但它似乎不会导致下面的最终getBytes调用使用UTF8:
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());
erickson.. 293
不幸的是,file.encoding
必须在JVM启动时指定属性; 当您输入主方法时,由String.getBytes()
和使用的字符编码InputStreamReader
和OutputStreamWriter
已永久缓存的默认构造函数.
正如Edward Grech指出的那样,在这种特殊情况下,环境变量JAVA_TOOL_OPTIONS
可用于指定此属性,但通常如下所示:
java -Dfile.encoding=UTF-8 … com.x.Main
Charset.defaultCharset()
将反映file.encoding
属性的更改,但核心Java库中需要确定默认字符编码的大多数代码不使用此机制.
在编码或解码时,可以查询file.encoding
属性或Charset.defaultCharset()
查找当前的默认编码,并使用适当的方法或构造函数重载来指定它.
不幸的是,file.encoding
必须在JVM启动时指定属性; 当您输入主方法时,由String.getBytes()
和使用的字符编码InputStreamReader
和OutputStreamWriter
已永久缓存的默认构造函数.
正如Edward Grech指出的那样,在这种特殊情况下,环境变量JAVA_TOOL_OPTIONS
可用于指定此属性,但通常如下所示:
java -Dfile.encoding=UTF-8 … com.x.Main
Charset.defaultCharset()
将反映file.encoding
属性的更改,但核心Java库中需要确定默认字符编码的大多数代码不使用此机制.
在编码或解码时,可以查询file.encoding
属性或Charset.defaultCharset()
查找当前的默认编码,并使用适当的方法或构造函数重载来指定它.
来自JVM™工具界面文档......
由于无法始终访问或修改命令行,例如在嵌入式VM中或仅在脚本内深入启动的VM中,
JAVA_TOOL_OPTIONS
因此提供变量以便在这些情况下可以启动代理.
通过将(Windows)环境变量设置JAVA_TOOL_OPTIONS
为-Dfile.encoding=UTF8
,System
每次启动JVM时都会自动设置(Java)属性.您将知道该参数已被选中,因为以下消息将被发布到System.err
:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
我有一种绝对有效的hacky方式!
System.setProperty("file.encoding","UTF-8"); Field charset = Charset.class.getDeclaredField("defaultCharset"); charset.setAccessible(true); charset.set(null,null);
这样你就会欺骗JVM,它会认为charset没有设置,并让它在运行时再次设置为UTF-8!
我认为比设置平台的默认字符集更好的方法,特别是因为你似乎对影响应用程序部署有限制,更不用说平台了,就是调用更安全的方法String.getBytes("charsetName")
.这样你的应用程序就不依赖于它无法控制的东西.
我个人认为String.getBytes()
应该弃用,因为它在我见过的许多情况下都会造成严重问题,开发人员没有考虑可能更改的默认字符集.
我无法回答你原来的问题,但我想提供一些建议 - 不要依赖于JVM的默认编码.最好在代码中明确指定所需的编码(即"UTF-8").这样,您就知道它甚至可以跨不同的系统和JVM配置工作.
试试这个 :
new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
我们遇到了同样的问题.我们有条不紊地尝试了本文(和其他人)的一些建议但无济于事.我们还尝试添加-Dfile.encoding = UTF8,似乎没有任何工作.
对于遇到此问题的人,以下文章最终帮助我们跟踪描述了语言环境设置如何在Java/Tomcat中打破unicode/UTF-8
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
在〜/ .bashrc文件中正确设置语言环境对我们有用.