wstring :: find()不适用于非拉丁符号?

sha*_*ote 5 c++ stl wstring setlocale

我的代码中有一个宽字符串(std :: wstring),我需要在其中搜索宽字符.

我使用find()函数:

    wcin >> str;
    wcout << ((str.find(L'?') != wstring::npos)? L"EXIST":L"NONE");
Run Code Online (Sandbox Code Playgroud)

L'?' 是一封西里尔字母.

但是同一个调用中的find()总会返回npos.在拉丁字母的情况下,find()可以正常工作.

这是这个功能的问题吗?或者我做错了什么?

UPD

我使用MinGW并以UTF-8保存源代码.我也设置了语言环境setlocale(LC_ALL, "");.代码相同的wcout << L'?';工作是coorectly.但同样的

wchar_t w;
wcin >> w;
wcout << w;
Run Code Online (Sandbox Code Playgroud)

工作不正确.

它很奇怪.之前我使用setlocale()编码没有问题.

rub*_*nvb 3

源文件的编码和执行环境的编码可能有很大不同。C++ 对此不做任何保证。您可以通过输出字符串文字的十六进制值来检查这一点:

\n\n
std::wcout << std::hex << L"\xd1\x84";\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 C++11 之前,您可以通过使用十六进制值在源代码中使用非 ASCII 字符:

\n\n
"\\x05" "five"\n
Run Code Online (Sandbox Code Playgroud)\n\n

C++11 添加了指定其 Unicode 值的能力,在您的情况下是

\n\n
L"\\u03A6"\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您要使用完整的 C++11(并且您的环境确保它们以 UTF-* 编码),您可以使用charchar16_t、 或中的任何一个char32_t,然后执行以下操作:

\n\n
const char* phi_utf8 = "\\u03A6";\nconst char16_t* phi_utf16 = u"\\u03A6";\nconst char32_t* phi_utf16 = U"\\u03A6";\n
Run Code Online (Sandbox Code Playgroud)\n