WritePrivateProfileStringA() 和 Unicode 如何结合在一起?

How do WritePrivateProfileStringA() and Unicode go together?

我正在处理一个使用 INI 文件的遗留项目,目前我正在尝试了解 Microsoft 如何处理 INI 文件。

WritePrivateProfileStringA() [MSDN] 的文档说 lpFileName:

If the file was created using Unicode characters, the function writes Unicode characters to the file. Otherwise, the function writes ANSI characters.

这到底是什么意思?什么是“使用 Unicode 字符创建”的文件? Microsoft 如何确定文件是否使用 Unicode 字符创建?

由于这是在 lpFileName 下记录的,它们是否在文件名中引用了 Unicode 字符,例如“如果文件有日文文件名,我们将把它读作 Unicode”?

默认情况下,...A()...W() 方法都不支持 Unicode 作为 INI 文件的文件内容。如果例如该文件不存在,他们将创建一个包含 ANSI 内容的文件。

但是,如果您先创建 INI 文件并给它一个 UTF-16 BOM(字节顺序标记),...A()...W() 都会遵守该 BOM 并写入 UTF -16 个字符到文件。

除了 BOM,文件可以是空的,所以一个包含 0xFF 0xFE 内容的 2 字节文件足以让 Microsoft API 写入 Unicode 字符。

这两种方法都不会识别和尊重 UTF-8 BOM。事实上,如果 UTF-8 BOM 和第一部分都在第 1 行,UTF-8 BOM 可能会破坏现有文件。在这种情况下,您无法访问受影响部分中的任何键。如果第一部分在第 2 行,UTF-8 BOM 将无效。

我在 Windows 10 21H1 上的测试 无法 确认 statement about UTF16-BE support 从 2006 年开始:

Just for fun, you can even reverse the BOM bytes and WritePrivateProfileString will write to it as a UTF-16 BE (Big Endian) file!