Jiang's C++ Space

创作,也是一种学习的过程。

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::

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;”就可以了,好像一共才三处地方,十分简单,代码一看就懂,不多说了。

posted on 2010-07-05 15:31 Jiang Guogang 阅读(6171) 评论(2)  编辑 收藏 引用 所属分类: Windows Programming

评论

# re: 让TinyXML保存文件为UTF-8格式 2010-07-05 16:05 Matthew
你真是细心啊,像我就不会想那么多  回复  更多评论
  

# re: 让TinyXML保存文件为UTF-8格式 2010-07-06 09:09 mr.huang
差距啊,国哥。。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理