字符串函数差异
本主题介绍用于处理 Unicode 和字符集信息的字符串函数之间的差异。 这些函数同时具有 Unicode 和 Windows 代码页 实现,以支持 Unicode 和 Windows 代码页参数。
以下字符串函数不需要特殊注释。 它们的 Unicode 和 Windows 代码页实现的工作方式相同。
- CharNext
- CharPrev
- StringCchCat、 StringCchCatEx
- StringCchCopy、 StringCchCopyEx
- StrCbLength、 StrCchLength
其中一个字符串长度函数检索的长度值始终基于正常字符宽度:Windows 代码页为 8 位,Unicode 为 16 位。 此值通常称为“字符计数”。此术语严格正确,因为使用 双字节字符集 的 Windows 代码页 (DBCSs) 具有一些全角字符,实际上由两个连续字节表示。 Unicode 中的 代理项 也会出现类似的情况。
以下字符串函数对当前线程的区域设置敏感,这些区域设置派生自用户在控制面板中选择的语言。 lstrcmp 和 lstrcmpi 函数不执行其 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 实现。 有关详细信息,请参阅 安全注意事项:国际功能。
相关主题