设置默认的Java字符编码?
如何以编程方式正确设置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());
不幸的是,必须在JVM启动时指定file.encoding
属性; 在input主方法的时候, String.getBytes()
使用的字符编码和InputStreamReader
和OutputStreamWriter
的默认构造函数已被永久caching。
正如Edward Grech指出的那样,在这种特殊情况下, 可以使用环境variablesJAVA_TOOL_OPTIONS
来指定这个属性,但通常这样做:
java -Dfile.encoding=UTF-8 … com.x.Main
Charset.defaultCharset()
将反映对file.encoding
属性的更改,但核心Java库中的大多数需要确定默认字符编码的代码不使用此机制。
在编码或解码时,可以查询file.encoding
属性或Charset.defaultCharset()
来查找当前的默认编码,并使用适当的方法或构造函数重载指定它。
从JVM™工具接口文档…
由于不能总是访问或修改命令行,例如在embedded式VM中或者在脚本内部深入启动的VM中,会提供
JAVA_TOOL_OPTIONS
variables,以便在这些情况下启动代理。
通过将(Windows)环境variablesJAVA_TOOL_OPTIONS
为-Dfile.encoding=UTF8
,每当启动JVM时,将自动设置(Java) System
属性。 您将知道该参数已被拾取,因为以下消息将被发送到System.err
:
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8
我有一个哈克的方式,绝对有效!
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()
应该被弃用,因为在我看到的一些情况下,开发人员没有考虑到可能会改变的默认字符集,这已经造成了严重的问题。
我不能回答你原来的问题,但我想提供一些build议 – 不依赖于JVM的默认编码。 在代码中明确指定所需的编码(即“UTF-8”)总是最好的。 这样,即使在不同的系统和JVMconfiguration中,也可以使用这种方法。
尝试这个 :
new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
我们遇到了同样的问题。 我们有条不紊地尝试从这篇文章(和其他人)的几个build议无济于事。 我们也尝试添加-Dfile.encoding = UTF8,但似乎没有任何工作。
对于有这个问题的人,下面的文章最后帮助我们追踪描述了区域设置如何破坏Java / Tomcat中的unicode / UTF-8
http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat
在〜/ .bashrc文件中正确设置语言环境对我们有效。
不清楚你在做什么,现在没有控制权。 如果可以在目标文件上插入一个不同的OutputStream类,则可以使用OutputStream的子types,它将string转换为您定义的字符集下的字节,默认为UTF-8。 如果修改后的UTF-8足够满足您的需求,您可以使用DataOutputStream.writeUTF(String)
:
byte inbytes[] = new byte[1024]; FileInputStream fis = new FileInputStream("response.txt"); fis.read(inbytes); String in = new String(inbytes, "UTF8"); DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt")); out.writeUTF(in); // no getBytes() here
如果这种方法不可行的话,如果你在数据stream和执行环境方面确切地说明了你能够控制的和不能控制的东西(虽然我知道有时候比确定更容易)。 祝你好运。
我已经尝试了很多东西,但是这里的示例代码很完美。 链接
代码的关键是:
String s = "एक गाव में एक किसान"; String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
我们在那里设置了两个系统属性,它使得系统把所有东西都变成了utf8
file.encoding=UTF8 client.encoding.override=UTF-8
继@Caspar对接受的答案发表评论后,根据Sun解决这个问题的首选方法是:
“在启动Java程序之前,更改底层平台的语言环境”
http://bugs.java.com/view_bug.do?bug_id=4163515
对于docker工人来说:
最近我遇到了一家本地公司的Notes 6.5系统,发现这个webmail在一个非中文的本地安装的Windows上显示无法识别的字符。 在网上挖了几个星期,就在几分钟前就想出来了:
在Java属性中,将以下string添加到运行时参数
-Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950
UTF-8设置在这种情况下不起作用。