CharLower()和宽度超过16位的字符

And*_*eas 1 unicode winapi

所以文档CharLower说它也可以转换单个字符,即:

如果此参数的高位字为零,则低位字必须包含要转换的单个字符.

这让我很困惑,因为如果高阶词应该被清零,这意味着CharLower()只能转换U + 0000到U + FFFF范围内的字符.但是更高范围的角色呢?我是否必须将这些转换为LPTSTR第一个并将其传递给CharLower()那个或者这应该如何工作?

Dav*_*nan 5

文件的完整引用如下:

以null结尾的字符串,或指定单个字符.如果此参数的高位字为零,则低位字必须包含要转换的单个字符.

此参数解释为:

  • 指向以null结尾的字符串的指针,或
  • 一个单一的wchar_t价值.

这是可能的原因是内存地址<65536被保留并被认为是无效指针.要在此单字符模式下使用该功能,您可以这样调用它:

WCHAR chr = (WCHAR) CharLowerW((WCHAR*)L'A');
Run Code Online (Sandbox Code Playgroud)

然后你问:

这让我很困惑,因为如果高阶词应该被清零,这意味着CharLower()只能转换U + 0000到U + FFFF范围内的字符.但是更高范围的角色呢?我是否必须将这些转换为LPTSTR第一个并将其传递给CharLower()那个或者这应该如何工作?

这是对的.在单字符模式下,不支持代理对.您必须将它们作为以null结尾的字符串传递.

可以合理地猜测,这个界面可以追溯到Windows支持UCS-2的日子,UCS-2是UTF-16的前置光标.UCS-2是一个固定长度的编码,只支持代码点<= U + FFFF,并且没有出现您描述的问题.UTF-16为代码点> U + FFFF添加了代理.这种界面设计是全面的,尽管有点笨拙.