字符串函数差异

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

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

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

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

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

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

格式规范 Windows 代码页版本的数据类型 Unicode 版本的数据类型
c WCHAR
C WCHAR
hc、hC
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++ 对应项以及特定的 windows 实现Microsoft。 有关详细信息,请参阅 安全注意事项:国际功能

 

在 Windows API Unicode