从Win32 ToUnicode()/ ToAscii()输出的最大字符数

时间:2017-03-08 09:13:54

标签: windows winapi unicode ascii

可以从Win32函数ToUnicode()/ ToAscii()输出的最大字符数是多少?

在给定虚拟键码,扫描键码和键盘状态的情况下,它可以输出的内容是否合理上限?

1 个答案:

答案 0 :(得分:2)

在我的Windows 8计算机上USER32!ToAscii使用内部缓冲区调用USER32!ToUnicode并将cchBuff设置为2.因为ToAscii的输出为LPWORD且不是LPSTR我们无法对此调查中ToUnicode的实际限制做出任何假设,但我们知道ToAscii 始终将输出WORD }。返回值告诉您此WORD的0,1或2个字节是否包含有用数据。

继续ToUnicode,事情变得有点棘手。如果它返回0则没有写入任何内容。如果它返回1或-1,则写入一个UCS-2代码点。然后我们留下奇怪的2 <= return表达式。我们可以尝试剖析MSDN文档:

  

两个或多个字符被写入pwszBuff指定的缓冲区。最常见的原因是存储在键盘布局中的死键字符(重音符号或变音符号)无法与指定的虚拟键组合以形成单个字符。但是,缓冲区可能包含的字符数多于返回值指定的字符数。发生这种情况时,任何额外的字符都无效,应该被忽略。

您可以将其解释为&#34;写入了两个或更多字符,但只有两个字符有效且#34;但是,返回值应记录为2而不是2 ≤ value

我相信在这句话中有两件事情我们应该消除所谓的&#34;额外的角色&#34;:

  

但是,缓冲区可能包含的字符数多于返回值指定的字符数。

这只是意味着函数可以在缓冲区上超出它实际返回的有效值。这可以通过以下方式得到证实:

  

发生这种情况时,任何额外的字符都无效,应该被忽略。

这让我们留下了不幸的开场白:

  

两个或多个字符被写入pwszBuff指定的缓冲区。

我想象返回值2没有问题,它可以像基本字符和diacritic一样简单,而不是作为预先组合的代码点存在。

&#34;或更多&#34;部分可能来自多个来源。如果基本字符被编码为代理对,那么任何额外的变音符号/组合字符将推动你超过2.基本字符上也可能只有一个以上的变音符号/组合字符。甚至可能存在领先的LTR / RTL标记。

我不知道是否有可能同时结束所有3个条件,但我会安全地播放并指定10个左右WCHAR的缓冲区。这应该完全在你可以在键盘上产生的限制内进行#34;一次击键&#34;。

这绝不是最终答案,但除非微软的某些人做出回应,否则它可能是最好的答案。