TinyXML解析多字节字符但跳过[x]字符

时间:2013-03-15 16:05:00

标签: 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解析正常,生成的组合框按预期填充。当一个多字节字符放在(或接近,取决于多少字节)name元素的结尾时会出现问题。

<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的xml。客户端程序无济于事。

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

1 个答案:

答案 0 :(得分:0)

<?xml?> 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编码,则服务器必须提供该信息。如果不是,则表示服务器中存在错误。