Microsoft的lstrcmpi和Unicode字符的实现

时间:2017-03-21 01:30:34

标签: c++ windows winapi unicode

我试图了解我所看到的是一个错误,还是微软lstrcmpi函数的一些可接受的行为?

我可以用代码说明它:

WCHAR buff1[] = L"abc ";
WCHAR buff2[] = L"abc ";
buff1[3] = 0xFFFF;
buff2[3] = 0x0;
int res = lstrcmpi(buff1, buff2);
//res is 0 or equality!

编辑:以下评论的补充:

enter image description here

2 个答案:

答案 0 :(得分:4)

lstrcmpi使用当前区域设置(from thread or user)调用CompareString并返回"语言上恰当的结果"。

来自Michael Kaplans blog

  

...现在如果函数被命名为lstrcoll和lstrcolli,那么函数可能不会被如此普遍地滥用

and

  

请记住,在检查相等性时,特别是在涉及操作系统语义的注册表值之类的项目上,最好的答案是CompareStringOrdinal,回退到RtlCompareUnicodeString或更好的RtlEqualUnicodeString,或者如果你绝对必须wcsicmp(意识到那里)对于任何必须在Vista之前运行的东西,它是一个可能是错误的角色。

and finally

  

因为如果你出于适当的原因调用lstrcmpi(即你希望得到语言上有意义的结果,比如在用户界面中对列表进行排序),但是你想要的行为不同于不同的语言环境,那么CompareString与LOCALE_INVARIANT是一个很好的答案。

     

但如果你想要其他任何东西,包括前面提到的所有非语言用途,那么CompareStringOrdinal或RtlCompareUnicodeString是一个更好的选择。

它如何处理非字符实际上changed over time

答案 1 :(得分:2)

Unicode FFFF字符是Unicode规范中的非字符,因此在字符串比较期间可能会忽略它。这导致两个字符串相等。