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&amp;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();

Documentation of ByteString

由于文字来自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 来解决。