2016-02-26 68 views
3

我最近迁移JBoss的应用5〜8 Wildfly,因此不得不搬到从Java 6到Java 8UTF-8字符JAXB在Java中8

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

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

线路测试类的123是:

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

该试验是在地方特别以确保JAXB编组可以处理UTF-8字符,我相信e µ是。我添加了一个属性到JAXB编组,以确保这些字符是允许的:

堆栈溢出
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); 

我已经看到了多个问题(123),这似乎是相似的,但他们的答案枯萎解释为什么先前以单向方式解码的无效字符现在在另一个方面被解码或者看起来实际上与我没有相同的问题。

如果所有的字符都是有效的应该这会导致一个问题?我知道我必须失去一些东西,但我看不到什么。

+0

是源文件编码UTF-8呢? – andrucz

+0

是,从与声明的XML文件读取'<?XML版本= “1.0” 编码= “UTF-8” 独立= “是”?>' – kirsty

+0

看一看http://stackoverflow.com/questions/ 464874 /不可映射的字符的编码预警式的Java – andrucz

回答

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 

编辑在从网页上复制的情况下和以往将改变编码。这两个源文件都可以按照下面的方式创建,这可以让不同的文件可见。

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"), 
     latin1.getBytes(StandardCharsets.UTF_8)); 
}