symbian 下 xml 的操作总结

 

symbian 下 xml 的操作总结

是近在写导出与导入 xml 的代码,遇到了一个问题,就是当导出的数据中有汉字时,写入的 xml 中汉字是乱码,从而在导入xml 时,CParser 报 -996 错误,后来试着把 xml 中的汉字转成GBK,转成 gbk 采用的是 CCnvCharacterSetConverter 类的方法,这样导出的xml用记事本打开时,汉字可以正常显示了,但在解析时,CParser 还是不能解析,相当郁闷呀,想换一个 xml解析,无奈c++ 并不太熟,还是用这个 CParser 吧,忘了说了,写入 xml 时,我是自己写的一个类,通过 RRileWriteStream 写入数据。由于不能解析,就一直问群里的朋友,还有上网搜,找到的结果差不多都是把文件采用 utf-8 编码,但如果写入utf8编码就没有细说,还有说用记事本转换一下,但这都不是解决问题的方法,经过反复的测试,发现,在写入 xml 时,如果 xml 的 encoding="utf-8",再用 ue32 打开二进制,发现写入的是16位的,如果去掉这个编码,则是8位的,搞不懂为什么这样。

这个问题到现在还没有解决,后来无意中找到了 symbian 提供的生成xml的代码,是 mark 写的 ,通过 CSenDomFragment 写入,用这个试着写入,还行,写入成功,不过汉字还是乱码。试着导入,CParser 不报错了,哈,解决了一个问题,问题换成汉字显示出来是乱码了。问题解决了一个,又来一个,一直在考滤这个问题该怎么解决,我就查编码, symbian 用的是 unicode,我就断点调试,看写入时是否是 unicode 编码,嗯,发现写入时用的是 unicode编码,我当时用的是 TDesC8 写入到文件的,汉字是把 TDesC16 转成TDesC8再写入文件的,问题就在这里,不能这样转换,后来我改成将 unicode 换成utf8 ,再写入文件,导出 xml 后,查看文件,靠,终于看到汉字了,赶紧看看能不能导入,嗯,导入没有问题,不过还是乱码,这个就好解决了,因为现在是 utf8编码,转成 unicode,哈哈,汉字也显示出来了,终于解决了,后来试着用我自己写的生成xml的类,也没有问题,看来最终的问题出在了写入文件时的编码

那utf8 及 unicode 是如何转换的呢,采用 CnvUtfConverter 这个类中的静态方法完成转换。致此,困扰了近两周的 xml  问题终于结束了!!!

 

附一段代码:

void CXmlNode::SetValue(const TDesC16& aValue)
{
if (!this->iNodeValue)
{
iNodeValue = HBufC8::NewL(aValue.Length()*3);
}
else
{
iNodeValue->Des().Zero();
iNodeValue = iNodeValue->ReAlloc(aValue.Length()*3);
}
TPtr8 p = iNodeValue->Des();
if (CnvUtfConverter::ConvertFromUnicodeToUtf8(p,aValue)
== CCnvCharacterSetConverter::EErrorIllFormedInput)
{
User::Leave(CCnvCharacterSetConverter::EErrorIllFormedInput);
}

}

 



安平2009@原创
qi_jianzhou@126.com

posted @ 2010-07-19 17:16  zziss  阅读(292)  评论(0编辑  收藏  举报