我的代码中有一个宽字符字符串 (std::wstring),我需要在其中搜索宽字符。
我为此使用了 find() 函数:
wcin >> str;
wcout << ((str.find(L'ф') != wstring::npos)? L"EXIST":L"NONE");
L'ф'
是西里尔字母。
但是在同一调用中的 find() 总是返回 npos
.在带有拉丁字母的情况下,find() 工作正常。
是这个函数的问题? 还是我做错了什么?
UPD
我使用 MinGW 并以 UTF-8 格式保存源代码。
我还使用 setlocale(LC_ALL, "");
设置了语言环境.
代码相同wcout << L'ф';
工作正常。
但同样
wchar_t w;
wcin >> w;
wcout << w;
工作不正常。
这很奇怪。早些时候我使用setlocale()进行编码没有问题。
最佳答案
源文件的编码和执行环境的编码可能大不相同。 C++ 对此不做任何保证。您可以通过输出字符串文字的十六进制值来检查这一点:
std::wcout << std::hex << L"ф";
在 C++11 之前,您可以通过十六进制值在源代码中使用非 ASCII 字符:
"\x05" "five"
C++11 添加了指定它们的 Unicode 值的能力,在您的情况下是
L"\u03A6"
如果您要使用完整的 C++11(并且您的环境确保它们以 UTF-* 编码),您可以使用 char
、char16_t
、或 char32_t
,然后执行:
const char* phi_utf8 = "\u03A6";
const char16_t* phi_utf16 = u"\u03A6";
const char32_t* phi_utf16 = U"\u03A6";
关于c++ - wstring::find() 不适用于非拉丁符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15791473/