字符串函数差异

本主题介绍用于处理 Unicode 和字符集信息的字符串函数之间的差异。 这些函数同时具有 UnicodeWindows 代码页 实现,以支持 Unicode 和 Windows 代码页参数。

以下字符串函数不需要特殊注释。 它们的 Unicode 和 Windows 代码页实现的工作方式相同。

其中一个字符串长度函数检索的长度值始终基于正常字符宽度:Windows 代码页为 8 位,Unicode 为 16 位。 此值通常称为“字符计数”。此术语严格正确,因为使用 双字节字符集 的 Windows 代码页 (DBCSs) 具有一些全角字符,实际上由两个连续字节表示。 Unicode 中的 代理项 也会出现类似的情况。

以下字符串函数对当前线程的区域设置敏感,这些区域设置派生自用户在控制面板中选择的语言。 lstrcmplstrcmpi 函数不执行其 ANSI 同名的字节比较,例如 strcmp。 而是根据区域设置的规则比较字符串。

以下函数在 OEM 字符集与当前 Windows 代码页或 Unicode 之间转换,具体取决于所使用的版本:

打印函数(例如 StringCbPrintf)通过在其格式规范中提供以下新的和更改的数据类型来支持 Unicode。 这些格式规范会影响函数解释相应输入参数的方式。

格式规范 Windows 代码页版本的数据类型 Unicode 版本的数据类型
c CHAR WCHAR
C WCHAR CHAR
hc、hC CHAR CHAR
hs、hS LPSTR LPSTR
lc、lC WCHAR WCHAR
ls、lS LPWSTR LPWSTR
S LPSTR LPWSTR
S LPWSTR LPSTR

 

输出文本的数据类型始终取决于函数的版本。 当输入参数的数据类型与输出文本的数据类型不一致时,打印函数会根据需要执行从 Unicode 到当前 Windows 代码页的转换,反之亦然。

对于打印函数的 Unicode 版本,格式字符串为 Unicode,输出文本也一样。

注意

不良的缓冲区处理与许多涉及缓冲区溢出的安全问题有关。 请参阅 Strsafe.h 参考。 Strsafe.h 中定义的函数提供额外的处理,以便在代码中正确处理缓冲区。 出于此原因,它们旨在替换其内置的 C/C++ 对应项以及特定的 Microsoft Windows 实现。 有关详细信息,请参阅 安全注意事项:国际功能

 

Windows API 中的 Unicode