设置默认的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());
784763 次浏览

我不能回答你最初的问题,但我想给你一些建议——不要依赖JVM的默认编码。最好显式地指定所需的编码(例如:"UTF-8")。这样,您就知道它即使跨不同的系统和JVM配置也能工作。

我认为比设置平台的默认字符集更好的方法是调用更安全的String.getBytes("charsetName"),尤其是当你似乎对影响应用程序部署有限制时,更不用说平台了。这样,您的应用程序就不会依赖于超出其控制范围的东西。

我个人认为String.getBytes()应该被弃用,因为它在我所见过的许多情况下导致了严重的问题,在这些情况下,开发人员没有考虑到默认字符集可能发生的变化。

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

就像在这种特殊情况下的Edward Grech指出,一样,环境变量JAVA_TOOL_OPTIONS 可以被用来指定这个属性,但通常是这样做的:

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

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

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

不清楚在这一点上你能做什么,不能控制什么。如果可以在目标文件上插入不同的OutputStream类,则可以使用OutputStream的子类型,它将字符串转换为您定义的字符集下的字节,默认情况下是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

如果这种方法不可行,那么在这里阐明在数据流和执行环境方面哪些可以控制,哪些不能控制,可能会有所帮助(尽管我知道有时说起来容易做起来难)。祝你好运。

JVM™工具接口文档…

由于命令行不能总是被访问或修改,例如在嵌入式vm中或只是在脚本深处启动的vm中,因此提供了JAVA_TOOL_OPTIONS变量,以便在这些情况下可以启动代理。

通过将(Windows)环境变量JAVA_TOOL_OPTIONS设置为-Dfile.encoding=UTF8, (Java) System属性将在每次启动JVM时自动设置。你将知道参数已被拾取,因为下面的消息将被发布到System.err:

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

我们把这两个系统属性放在一起,它让系统把所有东西都变成utf8

file.encoding=UTF8
client.encoding.override=UTF-8

试试这个:

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))

我有一个非常有效的方法!!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

通过这种方式,您将欺骗JVM,它会认为字符集没有设置,并使它在运行时再次设置为UTF-8 !

我们有同样的问题。我们系统地尝试了本文(和其他文章)中的一些建议,但都无济于事。我们还尝试添加-Dfile.encoding=UTF8,但似乎没有任何工作。

对于有此问题的人,下面的文章最终帮助我们追踪描述了区域设置如何破坏Java/Tomcat中的unicode/UTF-8

http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

~/.bashrc文件中正确设置语言环境对我们来说是有效的。

我已经尝试了很多东西,但这里的示例代码工作完美。 链接 < / p >

代码的关键是:

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");

按照@Caspar对已接受答案的评论,根据Sun的说法,解决这个问题的首选方法是:

"在启动Java程序之前,更改底层平台的语言环境。"

http://bugs.java.com/view_bug.do?bug_id=4163515

docker参见:

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

最近,我偶然接触了一家本地公司的Notes 6.5系统,发现在非中文本地Windows安装系统上,web邮件会显示无法识别的字符。我在网上查了几周,几分钟前才发现:

在Java属性中,将以下字符串添加到Runtime Parameters

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

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

如果你正在使用Spring Boot并想要在JVM中传递参数file.encoding,你必须像这样运行它:

mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"

这是我们需要的,因为我们使用的是JTwig模板,而操作系统有ANSI_X3.4-1968,我们通过System.out.println(System.getProperty("file.encoding"));找到

希望这能帮助到一些人!

mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2

命令与exec-maven-plugin一起解决配置Jenkins任务时的以下错误。

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
Error occurred during initialization of VM
java.nio.charset.IllegalCharsetNameException: "UTF-8"
at java.nio.charset.Charset.checkName(Charset.java:315)
at java.nio.charset.Charset.lookup2(Charset.java:484)
at java.nio.charset.Charset.lookup(Charset.java:464)
at java.nio.charset.Charset.defaultCharset(Charset.java:609)
at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
at java.io.PrintStream.<init>(PrintStream.java:104)
at java.io.PrintStream.<init>(PrintStream.java:151)
at java.lang.System.newPrintStream(System.java:1148)
at java.lang.System.initializeSystemClass(System.java:1192)

我正在使用Amazon (AWS) Elastic Beanstalk,并成功地将其更改为UTF-8。

在Elastic Beanstalk中,进入配置>软件,“环境属性”。 添加(name) JAVA_TOOL_OPTIONS和(value) -Dfile.encoding=UTF8

保存后,环境将以UTF-8编码重新启动。

我的团队在装有Windows的机器上遇到了同样的问题。然后用两种方法解决了这个问题:

a)设置环境变量(即使在Windows系统首选项中)

< p > JAVA_TOOL_OPTIONS < br > -Dfile.encoding = UTF8 < / p >

b)在pom.xml中引入以下片段:

 -Dfile.encoding=UTF-8

 <jvmArguments>
-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001
-Dfile.encoding=UTF-8
</jvmArguments>

在我的项目中解决这个问题。希望它能帮助到别人。

我使用LIBGDX java框架,在我的android studio项目中也有这个问题。 在Mac OS中编码是正确的,但在Windows 10中有特殊字符和符号 俄语字符也显示为问题,如:?????

    修改android studio项目设置: File->Settings...->Editor-> File Encodings到UTF-8的所有三个字段(全局编码,项目编码和默认如下)
  1. 在任何java文件集中:

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

  2. 对于测试打印调试日志:

    System.out.println("My project encoding is : "+ Charset.defaultCharset());

在启动应用程序时设置jvm参数帮助我解决了这个问题。java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8

file.encoding=UTF-8 -这有助于在文件中使用Unicode字符。

sun.jnu.encoding=UTF-8 -这有助于将Unicode字符作为文件系统中的文件名。