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

标签 c++ stl wstring setlocale

我的代码中有一个宽字符字符串 (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-* 编码),您可以使用 charchar16_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/

相关文章:

c++ - 如何在 C++ 中移动、交换和比较快速排序的计数

c++ - 为什么标准没有提供 erase-remove-idiom 的便利助手?

c++ - 如何调整集合迭代器使其表现得像 map 迭代器?

c++ - 如何找到 C++ 标准的修订版,其中删除或更改了特定要求?

c++ - 停止使用 libpcap 捕获数据并将其保存在文件中

c++ - 需要生成100到500的随机数

C++使用wstring拆分unicode分隔的字符串

c++ - 寻找将 std::wstring 与 NSLog 一起使用的最便宜的方法

C++ 在 wstring 中查找制表符

c++ - 需要链表解释