我正在处理的应用程序将数据存储在 INI 文件中。该应用程序创建 INI 文件,该文件将由我们创建的另一个应用程序读取。 INI 文件也可以手动编辑。
INI 文件可能迟早会包含不同的语言,因此我们小心翼翼地确保该文件中使用的所有数据均为 unicode 格式。
最初创建 INI 文件后,我们在记事本中检查了该文件,发现字母间距被搞砸了。经过一些研究,我们发现了 Unicode 字节顺序标记 (BOM) FF FE
并在文件的开头开始编写它,一切似乎都很好 - 文件已正确创建并且可以手动编辑在记事本中。
现在是问题 - 我们一直在寻找 INI 文件解析器,而不是创建我们自己的解析器。 Boost property Tree 看起来很理想,但 BOM 似乎没有被底层 wifstream 过滤掉,最终 property tree 会因此抛出异常。
接下来我们尝试了 SimpleINI link text但 simpleINI (CSimpleIniW) 似乎不起作用,除非 UTF-8 标记位于文件的开头。
到目前为止,2 个看似开发良好的 INI 文件处理器无法处理我们简单的 INI 文件,因此我们开始认为我们采用了错误的方法。除了显而易见的“应该使用 XML”之外,对于这个问题,您还能提供哪些现实世界的建议?
更新:
我现在有这个工作。 BOM 不是问题所在。这是因为数据没有以 UTF8 格式存储。谢谢....
最佳答案
如果您打算在 INI 文件中使用 Unicode,则需要 BOM。如果没有 BOM,读者就不知道它使用的是哪种编码。它可能是 UTF-16(大/小端)或 UTF-8。这是 INI 文件的一大缺点。 XML 有一个可见的序言,您可以指定编码并且更容易处理。
我们使用 GetPrivateProfileStringW 读取 UTF-8 格式的 INI 文件,只要 BOM 存在就没有发现任何问题。
如果这是一个 Windows 应用程序,您真的应该切换到注册表。否则,XML 是必经之路。
关于windows - Unicode/非 Unicode/UTF-8 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1897710/