设置默认Java字符编码

设置默认Java字符编码,java,utf-8,character-encoding,Java,Utf 8,Character Encoding,如何以编程方式正确设置JVM(1.5.x)使用的默认字符编码 我读过-Dfile.encoding=which曾经是旧JVM的发展方向。我没有那种奢侈,因为我不想进去 我试过: System.setProperty("file.encoding", "UTF-8"); 属性被设置,但它似乎不会导致下面的最后一个getBytes调用使用UTF8: System.setProperty("file.encoding", "UTF-8"); byte inbytes[] = new byte[10

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

我读过
-Dfile.encoding=which
曾经是旧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的默认编码。最好在代码中明确指定所需的编码(即“UTF-8”)。这样,您就知道它甚至可以跨不同的系统和JVM配置工作。

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


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

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

在这种特殊情况下,可以使用环境变量
JAVA\u TOOL\u 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)

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

从文档中

由于命令行不能始终被访问或修改,例如在嵌入式虚拟机中或仅在脚本中深层启动的虚拟机中,因此提供了
JAVA\u TOOL\u OPTIONS
变量,以便在这些情况下可以启动代理

通过将(Windows)环境变量
JAVA\u TOOL\u OPTIONS
设置为
-Dfile.encoding=UTF8
,每次启动JVM时都会自动设置(JAVA)
系统
属性。您将知道该参数已被拾取,因为以下消息将发布到
系统。err

选择JAVA工具选项:-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,JVM会认为字符集没有设置,并使其在运行时再次设置为UTF-8

我们遇到了同样的问题。我们有条不紊地尝试了本文(和其他文章)中的几条建议,但都无济于事。我们还尝试添加
-Dfile.encoding=UTF8
,但似乎没有任何效果

对于有此问题的人,下面的文章最终帮助我们找到了语言环境设置如何在
Java/Tomcat
中破坏
unicode/UTF-8


~/.bashrc
文件中正确设置区域设置对我们很有效。

我已经尝试了很多方法,但是这里的示例代码非常有效。

该守则的要点是:

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

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

“在启动Java程序之前,请更改基础平台的区域设置。”

有关docker,请参见:


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

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

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

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

如果您使用Spring Boot并希望传递参数
文件。在JVM中编码
您必须这样运行它:

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
命令与execmaven插件一起解决配置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)
Java热点(TM)64位服务器虚拟机警告:忽略选项MaxPermSize=512m;支持在8.0中被删除
初始化VM时出错
java.nio.charset.IllegalCharsetNameException:“UTF-8”
位于java.nio.charset.charset.checkName(charset.java:315)
位于java.nio.charset.charset.lookup2(charset.java:484)
在java.nio.charset.charset.l
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)
 -Dfile.encoding=UTF-8 
 <jvmArguments>
 -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8001
 -Dfile.encoding=UTF-8
 </jvmArguments>