让TinyXML保存文件为UTF-8格式
TinyXML是个好东西,这个不用我多说了,我用它做过好几个项目,但这几个项目都只是从xml文件中获取信息,没有涉及到写文件,最近需要生成xml的配置文件,才注意到这个问题,那就是TinyXML似乎不能保存文件为UTF-8格式。
我用UltraEdit打开生成的xml文件,UltraEdit把它识别为ASCII格式的文本文件,而通过二进制查看,也确实如此,我看了下帮助文档,也没具体提及到这个问题。但后来我仔细整理了一下思路后,发觉这个其实不算什么问题,分析如下。
文档上就说明了,TinyXML是完全支持UTF-8的,可以尝试load一个UTF-8格式的xml文件,完全没有问题,那现在问题是load了一个UTF-8文件后,文件中的字符串,在TiXmlDocument对象中,到底是什么格式?TinyXML在load它之后会不会直接把UTF-8格式转为Unicode格式?——不会,为什么?因为TinyXML在编写的时候是把自己定位为一个比较单纯的C++ Lib,它没有使用任何Windows相关的API,包括很重要的两个编码转换函数WideCharToMultiByte和MultiByteToWideChar,它都没用,对不同平台,编码转换函数可能是不同的,因此TinyXML不会画蛇添足地提供这个转换,也就是说,如果你的xml文件(UTF-8格式)中如果有中文的话,用TinyXML加载进来之后,依旧是UTF-8的,不经过转换直接print出来的话,就是乱码了,所以要经过一个UTF-8到Unicode的转换,转换代码我这里就不写了。再说一下,TinyXML声称对UTF-8的支持表示它认识UTF-8的xml文件,但并不表示它自动对UTF-8的文本进行转换。
好,再回到保存的问题上,其实你差不多想到了,应该怎么做,因为整个TinyXML其实并不计较内存中的文本究竟是什么内容,它都可以把文本当做是UTF-8(当然了,实际上把文本转为UTF-8然后交给TinyXML的工作是我们的程序去完成),那我们可不可以说保存的xml文件其实就已经是UTF-8格式的?——答案是肯定的。而UTF-8的格式标志其实就是文件头的三个字节:0xEF,0xBB,0xBF。有了这个头,用UltraEdit打开这个xml,UltraEdit就把它认为是一个UTF-8的文本文件了。
这个改动非常简单,稍微浏览下TinyXML的代码就知道怎么改了,我下载的TinyXML是2.6.1版本的(我没记错的话),在tinyxml.cpp文件中搜索“useMicrosoftBOM”,把“useMicrosoftBOM = false;”这个语句改为“useMicrosoftBOM = true;”就可以了,好像一共才三处地方,十分简单,代码一看就懂,不多说了。
转自:http://www.cppblog.com/guogangj/archive/2010/07/05/119351.html
让TinyXML保存文件为UTF-8格式的更多相关文章
- 【matlab】将matlab中数据输出保存为txt或dat格式
将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...
- Jquery调用从ashx文件返回的jsonp格式的数据处理实例
开发环境:vs2010+jquery-1.4.min.js 解决问题:网上代码比较少,好多调试不通,返回数据不用json而用jsonp主要考虑解决跨域问题 开发步骤:打开VS2010,新建一web站点 ...
- CFileDialog 打开文件夹文件 保存文件夹文件
格式说明: explicit CFileDialog( BOOL bOpenFileDialog, //TRUE 为打开, FALSE 为保存 L ...
- 【Android Developers Training】 25. 保存文件
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 将文本(lrc,txt)文件转换成UTF-8格式
UTF-8是UNICODE的一种变长字符编码又称万国码,由Ken Thompson于1992年创建.现在已经标准化为RFC 3629.UTF-8用1到6个字节编码UNICODE字符.用在网页上可以同一 ...
- 在linux下,去除^M,将windows格式文件(dos文件)改为unix格式文件
在Windows系统下编辑的文件,换行符回车的格式为'\r\n',在linux系统下,回车的格式为'\n',在Windows下编辑的文本文件在上传至linux服务器时,回车'\r\n'就显示成^M+' ...
- GDI+ gif文件的显示和格式转换
GDI+ gif文件的显示和格式转换 gdi+imagedeletenulltiff GDI+ gif文件的显示和格式转换 怎么获取gif文件的每一帧,并且显示出来呢? 1.怎么用gid+显示gi ...
- Beyond Compare脚本:命令行批量比较文件并生成html格式的差异报告
BComp.exe /silent /closescript /solo @E:\compareTest\BCbatch.txt text-report layout:side-by-side opt ...
- php -- PHP实现点击a标签的href做链接时,直接保存文件(任何类型),而不是通过浏览器直接打开下载的文件
之前做项目遇到这样一个问题,就是在php环境下,用a标签的href链接到一个资源,比如是mp3或者lrc文件时,点击之后不是出现保存文件的提示,而是调用本地程序打开文件或者直接在浏览器上解析.网上说可 ...
随机推荐
- 物联网网络编程和web编程
本文是基于嵌入式物联网研发project师的视觉对网络编程和web编程进行阐述. 对于专注J2EE后端服务开发的同学来说,这篇文章可能略微简单.可是网络编程和web编程对于绝大部分嵌入式物联网proj ...
- 关于erlang的向上取整和向下取整
在erlang的API中,erlang:trunc/1 是就近取整,erlang:round/1是四舍五入的, 整理下:对于正数的向上和向下取整, %% 向上取整 ceil(N) -> T = ...
- 美拍、秒拍中安卓、IOS短视频拍摄的一些关键技术
在发布<EasyDarwin开发出类似于美拍.秒拍的短视频拍摄SDK:EasyVideoRecorder>后,今天有人问到像美拍.秒拍这些短视频拍摄是怎么做到的,包括其中的一些功能,例如: ...
- 编译性语言&解释性语言
计算机是不能理解高级语言.当然也就不能直接执行高级语言了.计算机仅仅能直接理解机器语言,所以不论什么语言,都必须将其翻译成机器语言.不论什么编程语言编写的程序归根究竟都是由底层机器的机器代码(01序列 ...
- mac shell命令连接mongo
1. 安装rebomongo 2. mongo 192.168.1.100/databasename -u lsg -p 123456 3.db.drawspecs.find({name:'prize ...
- 学习selendroid初衷
为了解决工作中的一个问题,开始学习selendroid. 工作中,有一些所谓H5应用需要测试,这些应用程序描述如下: 通过微信平台传播,也就是依靠微信的朋友圈传播: 可以通过类似于http://XXX ...
- 03-树3 Tree Traversals Again(25 point(s)) 【Tree】
03-树3 Tree Traversals Again(25 point(s)) An inorder binary tree traversal can be implemented in a no ...
- php memcache知识点总结
$memcache = new Memcache; $memcache->connect('localhost',11211) or die('Could not connect'); //me ...
- extjs grid renderer参数用法
今天在导出EXT的二维时老是报错,追进去看是renderer : function(value)的参数不对,经过一番研究,未免以后遇到再次浪费时间,记录一下. var cm = new Ext.gri ...
- HDU2222 Keywords Search —— AC自动机
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 Keywords Search Time Limit: 2000/1000 MS (Java/O ...