unicode 和 & 字符的编码
Encoding for unicode and & characters
我正在尝试将以下字符串保存到我的 protobuff 模型中:
STOXX®Europe 600 Food&BevNR ETF
但是在打印原型模型值时显示如下:
STOXX®Europe 600 Food&BevNR ETF
我尝试将字符串编码为 UTF-8,也尝试了 StringEscapeUtils.unescapeJava(str)
,但都失败了。我通过解析来自服务器的 XML 响应来获取此字符串。有什么想法吗?
参考:XML 解析器 Skip invalid xml element with XmlStreamReader
更正 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 reader 来解决。
我正在尝试将以下字符串保存到我的 protobuff 模型中:
STOXX®Europe 600 Food&BevNR ETF
但是在打印原型模型值时显示如下:
STOXX®Europe 600 Food&BevNR ETF
我尝试将字符串编码为 UTF-8,也尝试了 StringEscapeUtils.unescapeJava(str)
,但都失败了。我通过解析来自服务器的 XML 响应来获取此字符串。有什么想法吗?
参考:XML 解析器 Skip invalid xml element with XmlStreamReader
更正 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);
这比具有数百个命名实体 &...;
.
两个垃圾字符而不是版权符号是由于将 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 reader 来解决。