[英]UTF-8 characters with JAXB in Java 8
我最近將 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");
我已經看到了多個問題( 1 , 2 , 3堆棧溢出),這似乎是相似的,但他們的答案枯萎解釋為什么這在以前解碼的一個方法無效字符在另一個正在解碼或不會出現真正具有相同像我一樣問題。
如果所有字符都有效,這是否會導致問題? 我知道我一定錯過了什么,但我看不到什么。
問題是在您的源代碼中, µ
被編碼為\\265
。 這對 UTF-8 無效。 作為 UTF-8 編碼,它是\습
。
在此源中,文件的字符編碼為 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));
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.