在ini文件中存储unicode字符串时是否会出现与编码相关的问题?

时间:2010-10-20 09:24:33

标签: windows winapi unicode ini

关于unicode和ini文件已有问题,但其中许多都是针对特定领域的。所以我不确定答案是否适用于一般情况。

动机:我想使用ini文件存储简单数据,如某些数字和一些字符串。字符串由用户提供(通过GUI输入)。该软件可以在世界任何地方运行,可以使用任何语言。这些文件也可以在用户之间共享(因此可以在一个系统上写入,在另一个系统上读取,等等)。

我认为使用GetPrivateProfileStringWWritePrivateProfileStringW(我的目标系统> = Windows XP)时,ini文件中的unicode应该没问题。

然后我在this question偶然发现了答案。

引用:

  

WritePrivateProfileStringW函数将以遗留系统编码(例如日语系统上的Shift-JIS)编写INI文件,因为它是传统的支持功能。如果您想要一个完全启用Unicode的INI文件,则需要使用外部库。

我现在不确定 - 我要担心吗?或者我可以继续使用ini文件吗?

修改

似乎避免随机编码的关键可能是准备一个包含BOM的空文件,然后使用该文件。有没有人(正面/负面)经历这个?

2 个答案:

答案 0 :(得分:2)

问题不在于使用ini文件,而是使用您将用于读取和写入这些文件的函数。

正如您所注意到的,WritePrivateProfileStringW()不会将UNICODE数据写入文件。相反,它将使用系统上标准的任何多字节编码。这意味着在日语系统上创建的ini文件在俄语系统上将无法读取。反之亦然。

如果文件不打算由具有不同编码的系统共享,那么你会没事的。否则,您可能不应该使用ini个文件,而是使用更多UNICODE感知的技术,例如XML,其编码在所有平台上默认为UTF-8

答案 1 :(得分:1)

答案是:是的,可能存在问题,具体取决于文件是否已存在以及(如果存在)其内容的编码方式。

如果ini文件的内容已经是Unicode,则将其视为Unicode。在内部,这似乎由IsTextUnicode函数决定。对于此功能,文件中的正确BOM是对Unicode的一个重要提示。因此,只需使用WritePrivateProfileStringW,就无法确保将Unicode写入ini文件,而是必须准备文件。

来源:Michael Kaplan's Blog