【问题标题】:Changing the default encoding for String(byte[])更改 String(byte[]) 的默认编码
【发布时间】:2008-09-17 09:06:33
【问题描述】:

有没有办法改变 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,但它不起作用。

【问题讨论】:

    标签: java encoding


    【解决方案1】:

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

    Java, bug ID 4163515

    有些地方似乎暗示你可以通过在启动JVM时设置file.encoding变量来做到这一点,例如

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

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

    【讨论】:

    • 有没有人尝试过 -Dfile.encoding 方法?能够以与平台无关的方式做到这一点会很棒。
    • @MattPassell 我们在启动 JVM 时使用以下参数来确保我们在任何地方都正确指定了 UTF-8:-Dfile.encoding=ISO646-US -Dsun.jnu.encoding=ISO646-US它似乎工作正常。
    • 感谢您的回复。我错过了什么吗?我刚刚在 Google 上搜索了 ISO646-US,发现它是 ASCII 的正式名称。这对确保您使用 UTF-8 有何帮助?
    • @MattPassell 它不能保证,但它很明显我们没有在开发过程中明确指定编码,因为字符集非常有限
    • 谢谢!对我来说,这个解决方案通过在启动 tomcat 时添加这个 JVM 参数来工作。
    【解决方案2】:

    引自defaultCharset()

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

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

    【讨论】:

    • 不是我希望的答案(我希望能够动态地做到这一点)。提供一个如何更改主要操作系统编码的示例会很棒。谢谢
    【解决方案3】:

    我想你想要这个:System.setProperty("file.encoding", "UTF-8");

    它解决了一些问题,但我还有其他问题。如果 SO 为 ISO-8859-1,则字符“í”和“Í”无法正确转换。只需在启动时使用 JVM 选项,我就可以解决它。现在,我在 NetBeans IDE 中的 Java 控制台在显示特殊字符时会导致字符集崩溃。

    【讨论】:

      猜你喜欢
      • 2013-10-18
      • 1970-01-01
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2011-05-10
      • 2013-07-27
      • 1970-01-01
      相关资源
      最近更新 更多