zoukankan      html  css  js  c++  java
  • 让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

  • 相关阅读:
    UIScrollView的滚屏
    ASIHTTPRequest 详解, 够详细
    Libxml2中使用xpath解析xml问题
    new Random()结果相同问题
    UINavigationController使用的一些技巧
    Objectivec 模拟http请求
    开发视频网站,asp.net视频文件转换.flv格式(转)
    jqueryjCarousel 配置选项
    NSDate和NSString之间的转换,(可以转时区的哈)
    NSLog的格式
  • 原文地址:https://www.cnblogs.com/lpxblog/p/5643904.html
Copyright © 2011-2022 走看看