2009-12-13 124 views
2

我正在处理的应用程序将数据存储在INI文件中。应用程序创建INI文件,然后将由我们也创建的另一个应用程序读取。 INI文件也可以手动编辑。Unicode /非Unicode/UTF-8问题

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

最初创建INI文件后,我们在记事本中检查了文件,发现文字间距已被拧紧。经过一些研究后,我们发现Unicode字节顺序标记(BOM)FF FE &在文件开始处开始写入并且看起来都很好 - 文件已正确创建,可以在记事本中手动编辑。

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

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

到目前为止,看似成熟的INI文件处理器将无法与我们简单的INI文件一起工作,因此我们开始认为我们采取了错误的方法。除了显而易见的“应该使用XML”之外,您可以针对这个问题提供哪些真实世界的建议?

更新:

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

回答

1

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

+0

我们无法控制哪些文本编辑器最终用户用于INI文件。 – Canacourse 2009-12-13 21:03:24

+0

然后如果可能的话,使用删除它们的脚本。 建议最终用户使用哪个文本编辑器。 – Dor 2009-12-13 21:08:12

1

是否有任何理由不使用本机Windows API读取和写入配置文件?使用本机API应确保数据将被两个应用程序一致地提取出来,因为它们会使用相同的确切API。

+0

是的,但我们无法控制哪些文本编辑器最终用户用于INI文件。 – Canacourse 2009-12-13 21:04:16

2

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

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

如果这是一个Windows应用程序,您应该切换到注册表。否则,XML是要走的路。

+0

谢谢。无法使用注册表。 Ini文件是在管理员PC上创建并在最终用户PC上处理的Cfg文件。 – Canacourse 2009-12-13 21:51:02

+0

有多种方法可以部署注册表更改。您可以在应用程序的安装包中执行此操作。或者在Intranet中,IT部门可以将注册表更改部署到PC。 – 2009-12-13 23:34:01