快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

新蒲京澳门赌场网站:利用Xerces C++正确处理XML文档中的中文



1. 背景先容

Apache的Xerces C++是广大年夜c/c++法度榜样员异常爱好应用的XML解析器之一。主要缘故原由是其本身是一个开放源代码的项目而且供给不合平台下的库和源代码,故深受广大年夜c/c++法度榜样员的迎接。

Xerces C++可以到以下网站下载:

1) http://xml.apache.org/

2) http://www.vckbase.com/tools

2. 问题描述

根据软件开拓的要求,作者开拓了一个文件特性识别软件,该软件可根据文件特有的特性识别出文件的类型。要求将文件特性保存在XML文件中。根据要求作者选择了Xerces C++作为XML解析器。但发明出了一个严重的问题:被解析的XML文件中不能包孕新蒲京澳门赌场网站中文,否则中文将不能精确的解析。作者钻研了Xerces C++供给的例子法度榜样,发明这些例子法度榜样解析的结果也是差错的。只有DOMPrint轨典范外。这肯定了Xerces C++本身是支持中文的。

XML编码:

SAXPrint法度榜样解析结果:

为此,作者曾经在IBM的中文网站发明一篇文章《若何使用Xerces-C++解析包孕中翰墨符的XML文档》并将其所描述的新蒲京澳门赌场网站法子利用到法度榜样中。但后情因为机械发生故障,硬盘上新蒲京澳门赌场网站的数据整个损掉。不得不把曩昔做过的事重做一遍。因一时在IBM的网站上未找到上面提到的贴子,而且因为当时捡现成的没有用心钻研着实现措施,故不得不仔细阐发Xerces C++供给的源代码,自己着手办理中文问题。为了往后广大年夜C++法度榜样员碰着类似问题时不会像我一样苦楚。我也抉择将自己的钻研结果公布出来供大年夜家分享。假如谁有更好的办理法子不要忘怀奉告我。

3. 缘故原由阐发

上面的例子里,法度榜样将“文档”两其中翰墨符解析成了乱码。但DOMPrint法度榜样确能够精确解析。这注解Xerces C++对国际编码肯定是支持的。作者经由过程对DOMPrint和SAXPrint两个法度榜样的对照跟踪发明问题的根本便是XMLFormatter设置的问题。因为SAX是基于事故的,大年夜多半应用者只是简单的解析XML文档,XMLFormatter的应用对照麻烦。而DOMPrint也是经由过程标准的输出法度榜样输出的屏幕上的,我们不能直接应用输出结果。

因为XML解析器解析的字符串都是XMLCh款式的,一个字符占用一个字节,而汉字字符确要占用两个字节。故若不做适当新蒲京澳门赌场网站的转换,汉字的输出结果就变成乱码了。

4. 办理法子

找到缘故原由就有办理问题的措施了,显着的必要一个把解析出来的XMLCh转换成通俗的字符串。这是解析,假如我们必要自己写入XML文档也有一个把通俗字符串转换为XMLCh的历程。我把这两个转换历程封装在了一个名为“XMLStringTranslate”的类中。应用如下:

void SAXMagicHandlers::startElement(const XMLCh* const name,AttributeList& attributes)

{

XMLStringTranslate stringTranslate("gb2312");

string strName=stringTranslate.translate(name);//获得可包孕汉字字符的通俗字符串

string strValue="pdf文档";

XMLCh * value= stringTranslate.translate(strValue.c_str());//将通俗字符串转换成新蒲京澳门赌场网站XMLCh串

}采纳XMLStringTranslate后的实际运行结果:

分外阐明:

因为为了防止内存开释问题,将通俗字符串转换成XMLCh *的translate函数返回的是类的一个成员变量,故下面的代码是不容许的:

XMLCh * value1= stringTranslate.translate("测试1");

XMLCh * value2= stringTranslate.translate("测试2");

这样应用的结果是value1和value2的值将是一样的(由于其内存地址根本便是一样的)。精确的应用措施是经由过程内存拷贝或则其他措施,将value1的值保存起来或则及时应用,否则value2将影响value1的值。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: