[英]javax.xml.bind.Marshaller encoding unicode characters with their decimal values
[英]Encoding for unicode and & characters
我正在尝试将以下字符串保存到我的 protobuff 模型中:
STOXX®Europe 600 Food&BevNR ETF
但是在打印 protomodel 值时,它显示为:
STOXX®Europe 600 Food&BevNR ETF
我尝试将字符串编码为 UTF-8 并尝试使用StringEscapeUtils.unescapeJava(str)
,但它失败了。 我通过解析来自服务器的 XML 响应来获取这个字符串。 有任何想法吗 ?
参考:XML 解析器使用 XmlStreamReader 跳过无效的 xml 元素
更正 XML 解析应该比需要取消所有内容更好。 请检查下面显示此内容的测试用例:
public static void main(String[] args) throws Exception {
XMLInputFactory factory = XMLInputFactory.newInstance();
factory.setProperty("javax.xml.stream.isCoalescing", true);
ReaderInputStream ris = new ReaderInputStream(new StringReader("<tag>STOXX®Europe 600 Food&BevNR ETF</tag>"));
XMLStreamReader reader = factory.createXMLStreamReader(ris, "UTF-8");
StringBuilder sb = new StringBuilder();
while (reader.hasNext()) {
reader.next();
if (reader.hasText())
sb.append(reader.getText());
}
System.out.println(sb);
}
输出:
STOXX®Europe 600 Food&BevNR ETF
实际上我有 protobuf 方法来解决这个问题:
ByteString.copyFrom(StringEscapeUtils.unescapeHtml3(string), "ISO-8859-1").toStringUtf8();
由于文本来自 XML 使用:
s = StringEscapeUtils.unescapeXml(s);
这比具有数百个命名实体的非转义 HTML 好&...;
.
两个垃圾字符而不是版权符号是由于将 UTF-8 编码文本(特殊字符的多字节)读取为某种单字节编码,可能是 Latin-1。
这个错误的转换可能会通过另一个转换来修复,但最好是使用 UTF-8 编码读取。
// Hack, just patching. Assumes Latin-1 encoding
s = new String(s.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
// Or maybe:
s = new String(s.getBytes(), StandardCharsets.UTF_8);
更好地检查读取代码,看看是否缺少可选的编码: InputStreamReader, OutputStreamWriter, new String, getBytes
。
您的整个问题也可以通过使用 XML 阅读器来解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.