Unicode /非Unicode / UTF-8问题

时间:2009-12-13 20:57:22

标签: windows unicode mfc

我正在处理的应用程序将数据存储在INI文件中。应用程序创建INI文件,该文件又将由我们创建的另一个应用程序读取。 INI文件也可以手动编辑。

INI文件可能迟早会包含不同的语言,所以我们要小心确保此文件中使用的所有数据都是unicode格式。

最初创建INI文件后我们在记事本中检查了文件并注意到字母间距被搞砸了。经过一些研究,我们发现了Unicode字节顺序标记(BOM)FF FE&开始在文件的开头写这个并且一切都很好 - 文件创建正确,可以在记事本中手动编辑。

现在问题 - 我们去寻找一个INI文件解析器,而不是创建我们自己的。 Boost属性Tree似乎很理想,但似乎BOM没有被底层的wifstream过滤掉,最终属性树会因此而引发异常。

接下来我们尝试了SimpleINI link text但是simpleINI(CSimpleIniW)似乎不起作用,除非UTF-8标记位于文件的开头。

到目前为止,2个看似发展良好的INI文件处理器无法使用我们的简单INI文件,所以我们开始认为我们采取了错误的方法。除了显而易见的“应该使用过的XML”,您可以提供有关此问题的真实世界建议吗?

更新:

我现在有这个工作。 BOM不是问题。这是因为数据没有存储在UTF8中。谢谢......

3 个答案:

答案 0 :(得分:2)

如果您打算在INI文件中使用Unicode,则需要BOM。没有BOM,读者不知道它在哪个编码。它可以是UTF-16(大/小端)或UTF-8。这是INI文件的一大缺点。 XML有一个可见的前导码,你可以指定编码,它更容易处理。

我们使用GetPrivateProfileStringW读取UTF-8中的INI文件,并且只要有BOM就没有发现任何问题。

如果这是一个Windows应用程序,你真的应该切换到注册表。否则,XML就是最佳选择。

答案 1 :(得分:1)

使用删除BOM的文本编辑器,例如Notepad ++ 删除BOM没有问题,这是Web开发中的常见解决方案。

答案 2 :(得分:1)

您是否有任何理由不使用本机Windows API来读取和编写配置文件?使用本机API应确保两个应用程序能够一致地获取数据,因为它们使用相同的API。