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

时间:2016-06-17 13:19:09

标签: winapi unicode

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

  

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

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

1 个答案:

答案 0 :(得分:5)

文件的完整引用如下:

  

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

此参数解释为:

  • 指向以空字符结尾的字符串的指针,或
  • 单个wchar_t值。

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

WCHAR chr = (WCHAR) CharLowerW((WCHAR*)L'A');

然后你问:

  

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

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

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