TinyXML 解析 UTF-8 字符串的问题

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

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

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

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

1 intlen;  
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 到的。为何会解析失败,原因待查。

免责声明:文章转载自《TinyXML 解析 UTF-8 字符串的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dp--区间dpMQTT协议简记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]使用 LDAP 组或角色限制访问,包含部分单点登录SSO说明

参考:http://www-01.ibm.com/support/knowledgecenter/api/content/SSEP7J_10.2.2/com.ibm.swg.ba.cognos.crn_arch.10.2.2.doc/c_restrict_access_using_ldap_groups_or_roles.html#Restrict_Acc...

Entity Framework Core Like 查询揭秘

在Entity Framework Core 2.0中增加一个很酷的功能:EF.Functions.Like(),最终解析为SQL中的Like语句,以便于在 LINQ 查询中直接调用。 不过Entity Framework 中默认提供了StartsWith、Contains和EndsWith方法用于解决模糊查询,那么为什么还要提供EF.Functions....

python数组操作

python中的数组其实就是list,但它更像是java的arraylist,而且功能比arraylist更强大。因为python的list其实是个对象,所以对于他的操作和删除比较有讲究。 创建列表sample_list = ['a',1,('a','b')]Python 列表操作sample_list = ['a','b',0,1,3]得到列表中的某一个...

Java中的ASCII、Unicode和UTF-8字符编码集

原文:@http://kxjhlele.iteye.com/blog/333211 首先讲一下几种字符的编码方式: 1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示2...

oracle 内置函数(二)字符函数

主要函数: 大小写转换函数 获取子字符串函数(字符串截取) 获取字符串长度函数 字符串连接函数 去除子字符串函数 字符替换函数 字符串出现次数 字符串按照特定符号拆分多行 一、大小写转换 1、upper:转大写 2、lower:转小写  3、initcap:首字母大写 二、获取子字符串函数(字符串截取) substr(str,beginIndex,...

VBA 字符串处理

1 VBA中的字符串 2 VBA中处理字符串的函数     2.1 比较字符串     2.2 转换字符串     2.3 创建字符串     2.4 获取字符串的长度     2.5 格式化字符串     2.6 查找字符串     2.7 提取字符/字符串     2.8 删除空格     2.9 返回字符代码     2.10 返回数值代表的相应字符...