更改String(byte[])的默认编码

10

是否有一种方法可以更改String(byte[])构造函数使用的编码方式?

在我的代码中,我使用String(byte[],String)来指定编码方式,但是我正在使用一个无法更改的外部库。

String src = "with accents: é à";
byte[] bytes = src.getBytes("UTF-8");
System.out.println("UTF-8 decoded: "+new String(bytes,"UTF-8"));
System.out.println("Default decoded: "+new String(bytes));

以下是输出结果:

UTF-8解码:带重音符号:é à
默认解码:带重音符号:é à 

我尝试更改系统属性file.encoding,但这并不起作用。

3个回答

7

在启动JVM之前,您需要更改语言环境,请参见:

Java错误ID 4163515

有些地方似乎暗示可以通过设置file.encoding变量来启动JVM时更改语言环境,例如

java -Dfile.encoding=UTF-8 ...

...但我自己没有尝试过。最安全的方法是在操作系统中设置环境变量。


有人尝试过使用“-Dfile.encoding”方法吗?如果能以平台无关的方式实现这一点,那将是非常好的。 - Matt Passell
@MattPassell 当我们启动JVM时,我们使用以下参数来确保在所有地方正确指定UTF-8:-Dfile.encoding=ISO646-US -Dsun.jnu.encoding=ISO646-US,看起来一切正常。 - Mat Mannion
谢谢您的回复。我有什么遗漏吗?我刚刚在谷歌上搜索了ISO646-US,发现它是ASCII的官方名称。那怎么能确保您正在使用UTF-8呢? - Matt Passell
@MattPassell,这并不能保证,但它明显表明我们在开发过程中没有明确指定编码,因为字符集非常有限。 - Mat Mannion
谢谢!对我来说,这个解决方案是在启动Tomcat时添加了这个JVM参数。 - Neets

1

引用自defaultCharset()

默认字符集在虚拟机启动时确定,通常取决于底层操作系统的语言环境和字符集。

在大多数操作系统中,您可以使用环境变量来设置字符集。


并不是我所期望的答案(我希望能够动态地进行更改)。提供如何更改主要操作系统编码的示例将会很棒。谢谢。 - Michel

1
我认为你需要这个:System.setProperty("file.encoding", "UTF-8");
它解决了一些问题,但我仍然有其他问题。如果操作系统是ISO-8859-1,则字符“í”和“Í”无法正确转换。只需在启动时使用JVM选项,我就可以解决它。现在只有我的NetBeans IDE中的Java控制台在显示特殊字符时会崩溃字符集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接