Java 8中带有JAXB的UTF-8字符

Java 8中带有JAXB的UTF-8字符,java,encoding,utf-8,jaxb,Java,Encoding,Utf 8,Jaxb,我最近将JBossAS5的一个应用程序迁移到了Wildfly 8,因此不得不从Java6迁移到Java8 我现在在通过Ant运行一个单元测试时遇到了一个问题: [javac] C:\Users\test\JAXBClassTest.java:123: error: unmappable character for encoding UTF8 测试类的第123行是: Assert.assertEquals("Jµhn", JAXBClass.getValue()); 此测试专门用于确保JAX

我最近将JBossAS5的一个应用程序迁移到了Wildfly 8,因此不得不从Java6迁移到Java8

我现在在通过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中添加了一个属性,以确保允许使用以下字符:

marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
我看到了关于堆栈溢出的多个问题(,),这些问题看起来很相似,但它们的答案却无法解释为什么以前以一种方式解码的无效字符现在以另一种方式解码,或者看起来与我没有相同的问题


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

问题在于,在源代码中,
µ
编码为
\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
编辑,以防网页中的复制和过去会改变编码。两个源文件都可以按如下所示创建,这将使差异变得可见

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));
}

源文件也编码UTF-8吗?是的,从带有声明的XML文件中读取
看看这已经是我考虑过的问题之一,将编码更改为ISO-8859-1确实允许我的测试通过Ant,但封送员仍然不接受字符并抛出异常。