【问题标题】:TinyXML parsing multi-byte characters but skipping following [x] charsTinyXML 解析多字节字符但跳过 [x] 字符
【发布时间】:2013-03-15 16:04:59
【问题描述】:

我有一个 c++ 程序,它从服务器接收一些 xml,然后尝试解析它以填充一些组合框,例如

<?xml version="1.0"?>
    <CustomersMachines>
        <Customer name="bob" id="1">
            <Machine name="office1" id="1" />
            <Machine name="officeserver" id="2" />
        </Customer>
     </CustomersMachines>

对于这些值,TinyXML 可以很好地解析,并且生成的组合框会按预期填充。当多字节字符放置在(或靠近,取决于多少字节)名称元素的末尾时,就会出现问题。

<Customer name="boß" id="3">

将导致组合框填充值 boß" id=

通过调试器,我看到当一个多字节字符传递给 ReadText() 时,元素中的以下 1-3 个单字节字符被跳过但自动包含在内,因此 tinyXML 不会注册关闭引用并继续解析,直到到达下一个。在发送 xml 的服务器上运行的应用程序主要使用 ISO-8859-1 编码,而 tinyXML 默认为 UTF-8。

我尝试将 tinyxml 调整为默认使用 TIXML_ENCODING_UNKNOWN,这似乎可以解决问题,但会在程序的其他地方引起大量问题。我尝试过的其他事情是在发送之前对 xml 服务器端进行 utf8_encode(但这会导致奇怪的字符显示在应该是多字节字符的组合框中),并强制编码到发送到的 xml客户端程序无济于事。

有人知道在这种情况下如何防止多字节字符自动忽略以下 1-3 个字符吗?

【问题讨论】:

  • 文件保存为什么编码?
  • 它从未真正保存为文件。服务器生成它并将其流式传输到客户端

标签: c++ utf-8 iso-8859-1 tinyxml


【解决方案1】:

&lt;?xml?&gt; prolog 未指定编码。如果编码不能通过带外方式在 XML 之外使用,则必须根据 XML 规范的Appendix F 中概述的规则,通过分析 XML 的起始字节来猜测编码。在这种情况下,这可能会导致选择 UTF-8。如果 XML 实际上不是 UTF-8 编码的,那将解释您所看到的行为。

在 ISO-8859-1 中,ß 编码为字节字节 0xDF" 编码为字节字节 0x22

在 UTF-8 中,0xDF 是 2 字节八位字节序列的起始字节,它解释了 " 被跳过的原因。但是,0xDF 0x22 不是有效的 UTF-8 2 字节字节序列,因此 TinyXml 应该会导致解析失败并出现错误。如果没有,那么这是 TinyXml 中的一个错误。

如果 XML 实际上是 ISO-8859-1 编码的,则服务器必须提供该信息。如果不是,那么这是服务器中的一个错误。

【讨论】:

  • 谢谢,提供修复它的编码,一切都按原样显示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多