c++ - TinyXML 解析多字节字符但跳过 [x] 个字符

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

我有一个 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 个字符吗?

最佳答案

<?xml?>序言未指定编码。如果编码在 XML 外部无法通过带外方式获得,则必须根据 Appendix F 中概述的规则,通过分析 XML 的起始字节来猜测编码。的 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 编码的,服务器必须提供该信息。如果不是,那就是服务器中的错误。

关于c++ - TinyXML 解析多字节字符但跳过 [x] 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15436988/

相关文章:

c# - 附加信息 : Attempted to read or write protected memory. 这通常表示其他内存已损坏

java - 使用 Java 构建的 XML 中的 UTF-8

javascript - 使用 angular-js 呈现 unicode-utf-8 土耳其语字符

perl - Mojolicious 模板无法呈现 © 字符

c++ - libjpeg:解压缩和裁剪

java - 人们还在编写自己的数据结构和算法吗?

c++ - 如果不满足构造函数中的某些条件,是否可以导致新的 C++ 类实例失败?

ms-access - 通过 VBScript 从文本中删除尾随的不可见字符

.net - 将字符串编码为 ISO8859-1 时出现问题

Perl - 更正命令行输入上的字符编码