繁体   English   中英

设置默认的 Java 字符编码

[英]Setting the default Java character encoding

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

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

我努力了:

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属性; 当您输入 main 方法时, 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()以查找当前的默认编码,并使用适当的方法或构造函数重载来指定它。

JVM™ 工具接口文档...

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

通过将(Windows)环境变量JAVA_TOOL_OPTIONS-Dfile.encoding=UTF8 ,每次启动 JVM 时都会自动设置(Java) System属性。 您将知道该参数已被拾取,因为以下消息将发布到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,JVM 会认为未设置字符集,并在运行时将其再次设置为 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文件中正确设置语言环境对我们~/.bashrc

我已经尝试了很多东西,但是这里的示例代码很完美。 关联

代码的关键是:

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

如果您正在使用 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"));

希望这可以帮助某人!

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

在 Elastic Beanstalk 中,转至配置 > 软件,“环境属性”。 添加(名称)JAVA_TOOL_OPTIONS 和(值)-Dfile.encoding=UTF8

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

在我的项目中解决这个问题。 希望它可以帮助某人。

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

  1. 在 android studio 项目设置中更改: File->Settings...->Editor-> File Encodings在所有三个字段(全局编码、项目编码和默认值)中都改为 UTF-8。

  2. 在任何 java 文件集中:

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

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

    System.out.println("My project encoding is : "+ 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

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

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)

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

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

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

对于码头工人,请参阅:

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

最近无意中碰到本地公司的Notes 6.5系统,发现在非中文本地化的Windows安装中,webmail会显示无法识别的字符。 在网上挖了几个星期,几分钟前才弄明白:

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

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

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

我的团队在使用 Windows 的机器上遇到了同样的问题。然后设法通过两种方式解决它:

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

JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF8

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

 -Dfile.encoding=UTF-8 

之内

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

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

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

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

如果您使用 AZURE,请在您的 webapp-component.yml 中使用以下设置

systemProperties:
   file.encoding: "UTF8"
   client.encoding.override: "UTF-8"

注意:如果您遇到编码问题,您的请求被替换为“?” 这是你的解决方案。

我们将两个系统属性设置在一起,它使系统将所有内容都转换为 utf8

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM