繁体   English   中英

Unicode 和 & 字符编码

[英]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&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();

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 阅读器来解决。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM