rapidxml对unicode的支持

  为了提高duilib创建布局控件的效率,在LuaDui项目中使用rapidxml解析器替换了duilib库自带的xml解析器。

duilib使用unicode编译,所以rapidxml需要解析unicode xml字符串。

  使用rapidxml解析unicode字符串很简单,只需在rapidxml的模板参数中设置为TCHAR即可,所以定义以下类型方便使用。

#include <rapidxml/rapidxml.hpp>
typedef rapidxml::xml_document<TCHAR> XmlDoc;
typedef rapidxml::xml_node<TCHAR> XmlNode;
typedef rapidxml::xml_attribute<TCHAR> XmlAttr;

  在使用过程中发现了解析xml中的中文字符出现bug,解析如下xml会出现问题抛出异常。

<?xml version="1.0" encoding="UTF-8"?>
<Window caption="0,0,0,30" sizebox="5,5,5,5" mininfo="480,360" defaultfontcolor="#ff010000" width="600" height="480">
<Font name="微软雅黑" size="12" bold="false"/>

<VerticalLayout bkcolor="#ff019bd0" inset="1,1,1,1" bordersize="1" bordercolor="#FF010000">
    <HorizontalLayout height="30" inset="5,0,0,0">
	<Label name="标题" text="调试窗口" textcolor="#FFFFFFFF"></Label>
	<Control />
        <Button name="minbtn" width="40" height="22" text="最小化" bkcolor="#ff3fd536">
	  <Event click="DebugUIEvent.minBtnClick" />
	</Button>
        <Button name="closebtn" width="47" height="22" text="关闭" bkcolor="#ffef2f4d">
	  <Event click="DebugUIEvent.closeBtnClick" />
	</Button>
    </HorizontalLayout>

  <VerticalLayout  bkcolor="#66ffffff">

  </VerticalLayout>
</VerticalLayout>
</Window>

  断点时发现在解析 text="最小化" 属性时出现问题,解析text值的时候把后面的内容全部当做text的属性值,无法再往下解析了。

最后终于找到了问题所在,rapidxml为提高解析效率,定义了如下的表:

        template<int Dummy>
        struct lookup_tables
        {
            static const unsigned char lookup_whitespace[256];              // Whitespace table
            static const unsigned char lookup_node_name[256];               // Node name table
            static const unsigned char lookup_text[256];                    // Text table
            static const unsigned char lookup_text_pure_no_ws[256];         // Text table
            static const unsigned char lookup_text_pure_with_ws[256];       // Text table
            static const unsigned char lookup_attribute_name[256];          // Attribute name table
            static const unsigned char lookup_attribute_data_1[256];        // Attribute data table with single quote
            static const unsigned char lookup_attribute_data_1_pure[256];   // Attribute data table with single quote
            static const unsigned char lookup_attribute_data_2[256];        // Attribute data table with double quotes
            static const unsigned char lookup_attribute_data_2_pure[256];   // Attribute data table with double quotes
            static const unsigned char lookup_digits[256];                  // Digits
            static const unsigned char lookup_upcase[256];                  // To uppercase conversion table for ASCII characters
        };

  来识别xml中的标志符,在进行查找的时候直接通过数组直接找到使用了

如下操作:

internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast<unsigned char>(ch)];

但在unicode下static_cast<unsigned char>(ch)的ch是wchar占两个字节直接转换为unsigned char会出现判断出错问题。所以要在rapidxml中解析unicode需要修改rapidxml代码:

       // Detect whitespace character
        struct whitespace_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_whitespace[static_cast<unsigned char>(ch)];
				else
					return 0;
            }
        };

        // Detect node name character
        struct node_name_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_node_name[static_cast<unsigned char>(ch)];
				else
					return 1;
            }
        };

        // Detect attribute name character
        struct attribute_name_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_attribute_name[static_cast<unsigned char>(ch)];
				else
					return 1;
            }
        };

        // Detect text character (PCDATA)
        struct text_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_text[static_cast<unsigned char>(ch)];
				else
					return 1;
            }
        };

        // Detect text character (PCDATA) that does not require processing
        struct text_pure_no_ws_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_text_pure_no_ws[static_cast<unsigned char>(ch)];
				else
					return 1;
            }
        };

        // Detect text character (PCDATA) that does not require processing
        struct text_pure_with_ws_pred
        {
            static unsigned char test(Ch ch)
            {
				if(ch<=255)
					return internal::lookup_tables<0>::lookup_text_pure_with_ws[static_cast<unsigned char>(ch)];
				else
					return 1;
            }
        };

        // Detect attribute value character
        template<Ch Quote>
        struct attribute_value_pred
        {
            static unsigned char test(Ch ch)
            {

                if (Quote == Ch(‘\‘‘))
					if(ch<=255)
						return internal::lookup_tables<0>::lookup_attribute_data_1[static_cast<unsigned char>(ch)];
					else
						return 1;
                if (Quote == Ch(‘\"‘))
					if(ch<=255)
						return internal::lookup_tables<0>::lookup_attribute_data_2[static_cast<unsigned char>(ch)];
					else
						return 1;
                return 0;       // Should never be executed, to avoid warnings on Comeau
            }
        };

        // Detect attribute value character
        template<Ch Quote>
        struct attribute_value_pure_pred
        {
            static unsigned char test(Ch ch)
            {
                if (Quote == Ch(‘\‘‘))
					if(ch<=255)
						return internal::lookup_tables<0>::lookup_attribute_data_1_pure[static_cast<unsigned char>(ch)];
					else
						return 1;
                if (Quote == Ch(‘\"‘))
					if(ch<=255)
						return internal::lookup_tables<0>::lookup_attribute_data_2_pure[static_cast<unsigned char>(ch)];
					else
						return 1;
                return 0;       // Should never be executed, to avoid warnings on Comeau
            }
        };

  

时间: 2024-10-09 10:09:10

rapidxml对unicode的支持的相关文章

各个系统和语言对Unicode的支持 字符集和编码——Unicode(UTF&amp;UCS)深度历险

http://www.cnblogs.com/Johness/p/3322445.html 各个系统和语言对Unicode的支持: Windows NT从底层支持Unicode(不幸的是,Windows 98只是小部分支援Unicode).先天即被ANSI束缚的C程序设计语言通过对宽字元集的支持来支持Unicode. Windows底层使用UTF16,Linux使用UTF32(未考证). C#和Java支持UTF16且是默认行为(如字符串天生为UTF16格式字符数组,Java还可以使用'\uxx

Erlang的Unicode支持

在R13A中, Erlang加入了对Unicode的支持.本文涉及到的数据类型包括:list, binary, 涉及到的模块包括stdlib/unicode, stdlib/io, kernel/file. Binary Binary的type属性增加了utf相关的type:utf8, utf16, utf32,其分别对应UTF8, UTF16,UTF32编码. Binary Constructing 在Binary构建时, 如果指定了utf相关类型,那么对应的integer的Value必须位于

Python中Unicode字符串

Python中Unicode字符串 字符串还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),0 - 255被用来表示大小写英文字母.数字和一些符号,这个编码表被称为ASCII编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122. 如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且

[Python爬虫] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习. 中文编码问题的处理核心都是--保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用Unicode字

【Windows编程】系列第四篇:使用Unicode编程

上一篇我们学习了Windows编程的文本及字体输出,在以上几篇的实例中也出现了一些带有“TEXT”的Windows宏定义,有朋友留言想了解一些ANSI和Unicode编程方面的内容,本章就来了解和学习一些Windows下关于ANSI和Unicode方面的编程基础. 计算机最早在美国诞生,所以最开始都是以英语为作为交互语言,由于只有26个字母,用一个字节(范围-128 ~ 127)表示,这个范围足够表示26个因为字符和一些常用的控制字符,这个就是ASCII编码.因此最早的各种程序设计语言以及使用的

Python-正确使用Unicode

正确处理文本,特别是正确处理Unicode.是个老生常谈的问题,有时甚至会难倒经验丰富的开发者.并不是因为这个问题很难,而是因为对软件中的文本,开发者没有正确理解一些关键概念及其表示方法.在StackOverflow上搜索关于UnicodeDecodeError相 关的问题,可以看到很多人都有这样的误解.这些错误的概念可以追溯到Unicode出现之前.那时许多现今的开发者还没入职,也包括我自己.如果这些错误 的概念没有散布开来,其实不是个问题.现在很多人都有这些错误概念,部分原因是因为有些非常流

Unicode简介

Unicode简介 壹佰软件开发小组  整理编译   在第一章中,我已经预告,C语言中在Microsoft Windows程序设计中扮演着重要角色的任何部分都会讲述到,您也许在传统文字模式程序设计中还尚未遇到过这些问题.宽字符集和Unicode差不多就是这样的问题. 简单地说,Unicode扩展自ASCII字符集.在严格的ASCII中,每个字符用7位表示,或者计算机上普遍使用的每字符有8位宽:而Unicode使用全16位字符集.这使得Unicode能够表示世界上所有的书写语言中可能用于计算机通讯

[Python] 中文编码问题:raw_input输入、文件读取、变量比较等str、unicode、utf-8转换问题

最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下笔记.方便以后查阅和大家学习.        中文编码问题的处理核心都是——保证所有的编码方式一致即可,包括编译器.数据库.浏览器编码方式等,而Python通常的处理流程是将unicode作为中间转换码进行过渡.先将待处理字符串用unicode函数以正确的编码转换为Unicode码,在程序中统一用U

支持打印和打印预览Word文档处理控件TX Text Control ActiveX

TX Text Control ActiveX 控件为软件开发人员提供了强大的所见所得的Word文档处理,可以加载.编辑和保存Wod格式(DOCX.DOC.RTF等),生成Word报表,文档转换,导出和直接创建PDF和PDF/A文件.该产品分发完全免费,包含了标准版.专业版和企业版. 具体功能: 支持打印和打印预览 文档可以分割为多个不同的段落,每个段落都可以单独的格式化 支持定义超链接,并加载和保存HTML文件 支持添加项目符号和数字列表 支持多层Undo和Redo操作 支持插入任何数量的列到