设置默认的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()使用的字符编码和InputStreamReaderOutputStreamWriter的默认构造函数已被永久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_OPTIONSvariables,以便在这些情况下启动代理。

通过将(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工人来说:

http://jaredmarkell.com/docker-and-locales/

最近我遇到了一家本地公司的Notes 6.5系统,发现这个webmail在一个非中文的本地安装的Windows上显示无法识别的字符。 在网上挖了几个星期,就在几分钟前就想出来了:

在Java属性中,将以下string添加到运行时参数

 -Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950 

UTF-8设置在这种情况下不起作用。