关于unicode和ini文件已有问题,但其中许多都是针对特定领域的。所以我不确定答案是否适用于一般情况。
动机:我想使用ini文件存储简单数据,如某些数字和一些字符串。字符串由用户提供(通过GUI输入)。该软件可以在世界任何地方运行,可以使用任何语言。这些文件也可以在用户之间共享(因此可以在一个系统上写入,在另一个系统上读取,等等)。
我认为使用GetPrivateProfileStringW
和WritePrivateProfileStringW
(我的目标系统> = Windows XP)时,ini文件中的unicode应该没问题。
然后我在this question偶然发现了答案。
引用:
WritePrivateProfileStringW函数将以遗留系统编码(例如日语系统上的Shift-JIS)编写INI文件,因为它是传统的支持功能。如果您想要一个完全启用Unicode的INI文件,则需要使用外部库。
我现在不确定 - 我要担心吗?或者我可以继续使用ini文件吗?
修改
似乎避免随机编码的关键可能是准备一个包含BOM的空文件,然后使用该文件。有没有人(正面/负面)经历这个?
答案 0 :(得分:2)
问题不在于使用ini
文件,而是使用您将用于读取和写入这些文件的函数。
正如您所注意到的,WritePrivateProfileStringW()
不会将UNICODE
数据写入文件。相反,它将使用系统上标准的任何多字节编码。这意味着在日语系统上创建的ini
文件在俄语系统上将无法读取。反之亦然。
如果文件不打算由具有不同编码的系统共享,那么你会没事的。否则,您可能不应该使用ini
个文件,而是使用更多UNICODE
感知的技术,例如XML,其编码在所有平台上默认为UTF-8
。
答案 1 :(得分:1)
答案是:是的,可能存在问题,具体取决于文件是否已存在以及(如果存在)其内容的编码方式。
如果ini文件的内容已经是Unicode,则将其视为Unicode。在内部,这似乎由IsTextUnicode函数决定。对于此功能,文件中的正确BOM是对Unicode的一个重要提示。因此,只需使用WritePrivateProfileStringW,就无法确保将Unicode写入ini文件,而是必须准备文件。