【问题标题】:UTF-8 characters with JAXB in Java 8Java 8 中带有 JAXB 的 UTF-8 字符
【发布时间】:2016-06-09 16:50:41
【问题描述】:

我最近将 JBoss AS 5 的应用程序迁移到 Wildfly 8,因此必须从 Java 6 迁移到 Java 8。

我现在在通过 Ant 运行我的一个单元测试时遇到了一个问题:

[javac] C:\Users\test\JAXBClassTest.java:123: error: unmappable character for encoding UTF8

测试类的第123行是:

Assert.assertEquals("Jµhn", JAXBClass.getValue()); 

该测试专门用于确保 JAXB 编组器可以处理 UTF-8 字符,我相信 µ 可以。我在 JAXB 编组器上添加了一个属性,以确保允许这些字符:

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

我在 Stack Overflow 上看到了多个问题(123),这些问题似乎相似,但他们的答案枯萎解释了为什么以前以一种方式解码的无效字符现在以另一种方式解码或似乎实际上与我没有相同的问题。

如果所有字符都有效,这会导致问题吗?我知道我一定错过了什么,但我看不到什么。

【问题讨论】:

  • 源文件也编码 UTF-8 吗?
  • 是的,从带有声明 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> 的 XML 文件中读取
  • 这已经是我看过的问题之一,将编码更改为 ISO-8859-1 确实允许我的测试通过 Ant,但编组器仍然不接受该字符并抛出一个例外。

标签: java encoding utf-8 jaxb


【解决方案1】:

问题是在您的源代码中µ 被编码为\265。这对 UTF-8 无效。 UTF-8 编码是\uC2B5

在此源中,文件的字符编码为 ISO8859。

class Latin1 {
    public static void main(String[] args) {
        String s = "µ"; // \265
        System.out.println(s);
    }
}

哪些可以用...编译

javac -encoding iso8859-1 Scratch.java

...但使用 UTF-8 编码失败

javac -encoding UTF-8 Latin1.java
Latin1.java:3: error: unmappable character for encoding UTF-8
        String s = "?";
                    ^

在此源中,文件的字符编码为 UTF-8。

class Utf8 {
    public static void main(String[] args) {
        String s = "µ"; // \uC2B5
        System.out.println(s);
    }
}

既可以使用 ISO8859-1 也可以使用 UTF-8 编译。

javac -encoding UTF-8 Utf8.java
javac -encoding iso8859-1 Utf8.java

edit 万一从网页复制和粘贴会改变编码。两个源文件都可以如下创建,这应该可以看出差异。

String latin1 = "class Latin1 {\n"
        + " public static void main(String[] args) {\n"
        + "        String s = \"µ\";\n"
        + "        System.out.println(s);\n"
        + " }\n"
        + "}";
Files.write(Paths.get("Latin1.java"), 
        latin1.getBytes(StandardCharsets.ISO_8859_1));

String utf8 = "class Utf8 {\n"
        + " public static void main(String[] args) {\n"
        + "        String s = \"µ\";\n"
        + "        System.out.println(s);\n"
        + " }\n"
        + "}";
Files.write(Paths.get("Utf8.java"), 
        utf8 .getBytes(StandardCharsets.UTF_8));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多