gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:19:18 24 4
gpt4 key购买 nike

我最近将 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),这些问题看起来很相似,但它们的答案都无法解释为什么以前以一种方式解码的无效字符现在以另一种方式解码或似乎实际上与我没有相同的问题。

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

最佳答案

问题是在您的源代码中,µ 被编码为 \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));
}

关于java - Java 8 中带有 JAXB 的 UTF-8 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35652281/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com