【原创】tinyXML文件保存编码(UTF-8, GB2312)相关的一个问题

    说说我用tinyXML遇到的一个小问题: 用tinyXML的SaveFile方法生成的XML文件中有中文字符,初始化时声明的encodeing为utf-8,用IE打开就报错,但是记事本打开不会显示乱码。

    在网上搜了半天。这个牵涉到对于XML文件编码方式的确认,就是说怎么认定某个XML文件的编码方式,可以参见这个文档http://www.cnblogs.com/azol/articles/1137035.html,简单来说就是先看BOM,没有就看文件里写的encodeing的值,再没有就默认utf-8。所以我遇到的IE打开报错的问题就是保存时没有写BOM(tinyXML默认是不写BOM的,useMicrosoftBOM在LoadFile时被置为false),而声明了encodeing为utf-8,则保存的这个XML文件的编码格式就是utf-8。所以IE解析的时候认为XML文件是utf-8编码的,就把中文按UTF-8来解释,而实际中文的编码是GB2312(因为我在写入元素的属性或文本时没有做编码转换,我使用的是多字节字符集),自然就报错了。而为什么记事本打开不是乱码呢,那就又要涉及到记事本程序对于文本文件的编码认定,参见http://kuyur.info/blog/archives/618,简单来说就是先判断BOM,没有再依据UTF-8字符串检测算法判断是否UTF-8,如果不是则最后默认是ANSI。所以以记事本打开SaveFile方法生成的XML文件时,首先是没有写BOM的,而检测UTF-8字符串也检测不到(我设置元素文本或属性时并没有将中文转为UTF-8格式),那最后就默认的认定为ANSI(这个和GB2312什么关系搞不太清楚),总之记事本认为打开的文件编码不是UTF-8,自然就不会乱码了。

点赞