TiXmlDocument虽然能读取utf-8的xml文件,但读入后在内存中是以多字节存储。如果新建一个TiXmlDocument,即使定义头为utf-8编码,直接调用SaveFile方法保存的文档仍然是Ansi(windows在CP936下为GBK)。TiXmlDocument不支持直接输出utf-8文档。
网上搜代码遍寻不着,自己摸索出来一个。
这里的编码转换过程是Ansi->Unicode->UTF-8。
Ansi:TiXmlDocument输出到TiXmlPrinter,调用TiXmlPrinter.CStr(),数据类型是char*
Unicode:数据类型WCHAR或CStringW
UTF-8:注意UTF-8的数据类型是char*,或者CStringA
CFile写入文件的方法Write需要两个参数,待写入数据的在内存的起始地址和要写入的字节数
windows平台utf-8文本的前三个字节是EF BB BF,也即BOM(Byte order mark)标记
代码:
XmlEntityTree=new TiXmlDocument;
TiXmlDeclaration *dec=new TiXmlDeclaration("1.0","utf-8","");
XmlEntityTree->LinkEndChild(dec);
TiXmlElement *pRoot=new TiXmlElement("test");
pRoot->SetAttribute("name","名字");
XmlEntityTree->LinkEndChild(pRoot);
TiXmlPrinter printer;
XmlEntityTree->Accept(&printer);

const CStringW UnicodeStr(printer.CStr());
const CStringA UTF8Str=CW2A(UnicodeStr,CP_UTF8);
char UTF8BOM[3]={‘\xEF’,'\xBB’,'\xBF’};

CFile theFile;
theFile.Open(_T("test.xml"),CFile::modeCreate|CFile::modeWrite);
theFile.Write(&UTF8BOM,3);
theFile.Write((LPCSTR)UTF8Str,UTF8Str.GetLength());
theFile.Close();

转自:http://blog.sina.com.cn/s/blog_5ebafa150100jo2s.html

最新文章

  1. 如何用ORM支持SQL语句的CASE WHEN?
  2. node开发
  3. http://182.92.241.20/mypro/login 偶的点金项目细化分包管理平台即将上线!!
  4. HDU 5828(线段树)
  5. Visual Studio 2010 更新NuGet Package Manager出错解决办法
  6. c++11:iota
  7. 推荐一个优秀的前端框架——Bootstrap
  8. 在Android studio模拟器中运行apk文件
  9. 异常处理&RandomAccessFile&节奏感
  10. C# 正则表达式应用
  11. (转)JDK 1.8 预览版Lambda语法分析
  12. Android 面试100问- 0序0
  13. 浅拷贝和深拷贝(谈谈java中的clone)
  14. Linux Shell 笔记
  15. Python-JS (JS介绍~JS的基础数据类型)
  16. ssh批量执行命令-paramiko
  17. 安卓 运行、调试 配置 android Run/debug configurations
  18. iOS app bundle id
  19. JQuery Mobile - 自定义图标!
  20. 仿饿了吗点餐界面两个ListView联动效果

热门文章

  1. 摘抄 - 不为人知的JS调用样式的方法---document.createElement().addRule(..)
  2. [Swift]编码拾遗
  3. 倒排索引构建算法BSBI和SPIMI
  4. htm 与 html 的区别
  5. [USACO 2011 Nov Gold] Above the Median【逆序对】
  6. K - KazaQ’s Socks
  7. 配置Ubuntu16.04第01步:U盘安装 Ubuntu 16.04系统
  8. C#中的list的System.Predicate<in T>和System.Comparison<in T>的应用
  9. ORA-00445: Background Process "xxxx" Did Not Start After 120 Seconds
  10. C# Equals的重写