为什么 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 字符编码。
给定这段代码:
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 字符编码。