【问题标题】:How do WritePrivateProfileStringA() and Unicode go together?WritePrivateProfileStringA() 和 Unicode 如何结合在一起?
【发布时间】:2022-01-23 00:48:57
【问题描述】:

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

WritePrivateProfileStringA() [MSDN] 的文档说lpFileName

如果文件是使用 Unicode 字符创建的,该函数会将 Unicode 字符写入文件。否则,该函数将写入 ANSI 字符。

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

由于这记录在lpFileName 下,它们是否指的是文件名中的 Unicode 字符,例如“如果文件有日文文件名,我们会将其读取为 Unicode”?

【问题讨论】:

  • 没有。这个遗留的 appcompat 函数的多个讨厌的问题之一是您无法控制编码。如果文件已经存在,并且使用 UTF16 BOM 写入,则写入 UTF16,否则使用系统代码页。鸡和蛋的问题,即使是 W 版本也没有解决它。 Win3中的INI文件总是使用系统代码页,这就是为什么它如此偏重的原因。不要使用它。

标签: windows winapi unicode


【解决方案1】:

默认情况下,...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 上的测试无法确认 2006 年的 statement about UTF16-BE support

只是为了好玩,您甚至可以反转 BOM 字节,WritePrivateProfileString 会将其作为 UTF-16 BE(Big Endian)文件写入!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-13
    • 2014-04-06
    • 1970-01-01
    • 2021-09-21
    • 2019-01-13
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    相关资源
    最近更新 更多