为什么 GetPrivateProfileSection 将每个字符检索为两个字节值,并用 NULL 字符填充它们?

Why does GetPrivateProfileSection retrieve each character as a two byte value, padding them with a NULL character?

给定这段代码:

Private Declare Auto Function GetPrivateProfileSection Lib "kernel32" _
        (ByVal lpAppName As String, _
         ByVal lpszReturnBuffer As Byte(), _
         ByVal nSize As Integer, ByVal lpFileName As String) As Integer

Public Class IniClassReader
    Public Function readWholeSection(iniFile as String, section as String) as String()
        Dim buffer As Byte() = New Byte(SECTIONLENGTH) {}
        GetPrivateProfileSection(section, buffer, SECTIONLENGTH, iniFile)
        Dim sectionContent As String = Encoding.Default.GetString(buffer)
        ' Skipped code embedded in the function below, not the point of the question
        return processSectionContent(sectionContent)
    End Function
End Class

我发现 buffer 包含一个字节序列,中间穿插着 NULL 个字符 ([=14=])。因此,sectionContent 值被间谍变量特征视为 'e n t r i e 1 = v a l u e 1 e n t r i e 2 = v a l u e 2'。每对 key/value 正如预期的那样后跟两个 NULL 个字符而不是一个。

我不明白为什么每个字符都存储为两个字节的值。 UTF8 替换 Default 得到相同的结果。 我尝试使用以 UTF8 和 Windows-1252(所谓的“ANSI”)编码的 INI 文件由微软提供)。

我知道如何处理那些额外的字节:

Dim sectionContent As String = Encoding.Default.GetString(buffer)
sectionContent = sectionContent.Replace(Chr(0) & Chr(0), vbNewLine).Replace(Chr(0), "")

但我想了解这里发生了什么以应用最佳解决方案,而不是仅在某些情况下起作用的草率 hack。

字节是 UTF-16 编码的文本。它看起来像空字符填充,因为您的所有文本都由编码适合低字节的字符组成。

Windows API 公开了函数的“A”和“W”版本,“A”版本在窄字符串中工作,“W”版本在窄字符串中工作宽弦。 Windows NT 家族树的默认值(因此所有 Windows 自 XP 以来)都是宽的,因为 UCS-2/UTF-16 是“本地”Windows 字符编码。