为什么使用 wchar_t 时两个内容相同的字符串不同?

Why are two strings with same content different while using wchar_t?

我正在编写代码来比较 LPSTR 类型和 wchar_t 类型的两个字符串。字符串的内容相同,但输出显示字符串不同。下面是完整代码的截图。

#include <iostream>
#include <string.h>
#include <wtypes.h>
using namespace std;
int main(int argc, char** argv) 
{
    LPSTR str1= "Abcdef123456";
    wchar_t *str2 = L"Abcdef123456";
    if(!strcmp((char *)str1, (char *)str2))
    {
        cout<<"same";   
    }
    else
    {
            cout<<"diff";
    }

    return 0;
}

执行后,输出是不同的。我认为输出应该是相同的。请帮忙。

L'A' 在内存中的表示与 'A' 不同。如果你假装 wchar_t 的数组是 char 的数组(通过显式转换 char*)并将其与另一个具有不同表示的 char 数组进行比较,它们将比较不同。

输出符合预期。


比较字符串的正确方法是将窄字符串转换为宽字符串。正确地做到这一点并不是微不足道的,所以这里有一个例子:

auto length = std::strlen(str1);
std::wstring temp(length, L'[=10=]');
std::mbstowcs(&temp[0], str1, length);
if (!wcscmp(temp.c_str(), str2))
   // ...