让TinyXML保存文件为UTF-8格式
2016-11-24 16:13
711 查看
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;”就可以了,好像一共才三处地方,十分简单,代码一看就懂,不多说了。
我用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;”就可以了,好像一共才三处地方,十分简单,代码一看就懂,不多说了。
相关文章推荐
- 让TinyXML保存文件为UTF-8格式
- 让TinyXML保存文件为UTF-8格式
- TXMLDOCUMENT读取UTF-8格式XML文件乱码问题
- Dom4j无法以UTF-8保存xml文件,Invalid byte 2 of 2-byte UTF-8 sequence -hxzon动手 -gdo
- TinyXML保存UTF-8编码的XML
- 保存文件为UTF8格式(Writing UTF-8 files in C++).
- Qt5文件操作_保存成"UTF-8"格式
- TinyXml 保存文件乱码
- 用SAXXMLReader将XML文件保存为缩进格式,方便阅读
- DOM方式保存xml为UTF-8格式
- C#源码学习之---将数据库数据以XML文件格式保存
- 转换 xml 格式,默认 utf-8 , 要输出成 gbk ,并保存 (java )
- PHP文件保存出现的BOM头(utf-8)的解决方式——保存格式为ANSI即可
- 解决IDEA XML文件编辑后保存格式错误导致MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3无效
- 配置vim 默认保存文件格式为UTF-8
- Dom4j保存数据乱码以及xml文件头编码格式改变的原因和解决方法
- Dom4j无法以UTF-8保存xml文件,出现异常:Invalid byte 2 of 2-byte UTF-8 sequence
- webwork 配置文件 web.xml通用格式
- Jpg文件和Xml 文件格式的互换
- 用ASP读取/写入UTF-8编码格式的文件