• 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

  • 相关阅读:
    C# 操作Excel
    分享C#原生ID(流水号)生成功能实现
    Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的解决办法
    c# 软件自动在线更新代码
    Win7 64bit系统下未能加载文件或程序集“System.Data.SQLite”的另一解决办法
    ActiveX控件的另类免费签名法(补充)
    ActiveX控件的另类免费签名法
    常用函数以及正则校验
    Delphi键盘按键伪码
    格林治时间
  • 原文地址:https://www.cnblogs.com/zziss/p/1780799.html
Copyright © 2020-2023  润新知