• 让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

  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/lpxblog/p/5643904.html
Copyright © 2020-2023  润新知