我想了解我所看到的是错误还是Microsoft 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!
编辑:以下注释的补充:
最佳答案
lstrcmpi
使用当前语言环境(from thread or user)调用CompareString
,并返回“在语言上适当的结果”。
从Michael Kaplans blog:
...现在,如果函数被命名为lstrcoll和lstrcolli,那么也许不会那么普遍地使用该函数
and:
请记住,当检查是否相等时,尤其是在涉及OS语义的注册表值之类的项目上,最佳答案是CompareStringOrdinal,回退到RtlCompareUnicodeString甚至更好的RtlEqualUnicodeString,或者如果您绝对必须wcsicmp(要意识到有一个字符)对于任何必须在Vista之前运行的东西可能是错误的。
and finally:
因为如果出于适当的原因调用lstrcmpi(即,您希望获得语言上有意义的结果,例如在用户界面中对列表进行排序),但是您希望行为不会因不同的语言环境而异,则带有LOCALE_INVARIANT的CompareString是一个很好的答案。
但是,如果您想要几乎所有其他东西,包括前面提到的所有非语言目的,那么CompareStringOrdinal或RtlCompareUnicodeString是一个更好的选择。
它如何处理非字符实际上具有changed over time。