zoukankan      html  css  js  c++  java
  • TinyXML 解析 UTF-8 字符串的问题

    TinyXML 在解析 UTF-8 格式的 XML 文件时,如果文件中含有以下两个字符串:“<name>文史经典</name>” 和 “<name>资讯速递</name>” 时,解析失败。

    分析代码,发现失败的原因是如下的代码:

    tinyxmlparser.cpp 文件中的函数:const char* TiXmlBase::ReadText()

    1 int len;  
    2 char cArr[4] = { 0, 0, 0, 0 };  
    3 p = GetChar( p, cArr, &len, encoding );  
    4 if ( len == 1 )  
    5     (*text) += cArr[0]; // more efficient  
    6 else  
    7     text->append( cArr, len );  

    初步分析,是对 UTF-8 字符串的解析问题。

    解析使用了如下的表:

    1 const int TiXmlBase::utf8ByteTable[256] = {// 0 1 2 3 4 5 6 7 8 9 a b c d e f1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x001, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    2  1, 1, 1, 1, // 0x101, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x201, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x301, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x401, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x501, 1, 1, 1, 1, 1,
    3  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x601, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x70 End of ASCII range1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x80 0x80 to 0xc1 invalid1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0x90 1, 1, 1, 1, 1,
    4  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xa0 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 0xb0 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xc0 0xc2 to 0xdf 2 byte2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // 0xd03, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    5  3, 3, 3, 3, 3, 3, // 0xe0 0xe0 to 0xef 3 byte4, 4, 4, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // 0xf0 0xf0 to 0xf4 4 byte, 0xf5 and higher invalid};

    此表网上可以 google 到的。为何会解析失败,原因待查。

  • 相关阅读:
    Java 网络编程的一些概念
    Java多线程之线程池
    Java多线程之线程协作
    Java多线程之线程同步
    Java 线程的基本使用
    线程的概念
    在Java中使用RabbitMQ
    Java Web
    Java 集合
    RabbitMQ的下载、安装
  • 原文地址:https://www.cnblogs.com/91program/p/5206053.html
Copyright © 2011-2022 走看看