我想了解我所看到的是错误还是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!


编辑:以下注释的补充:

c++ - 微软对lstrcmpi和Unicode字符的实现-LMLPHP

最佳答案

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

08-06 00:24