【发布时间】:2020-06-15 13:16:19
【问题描述】:
我正在尝试使用标准的 <regex> 库来匹配一些西里尔字母:
// This is a UTF-8 file.
std::locale::global(std::locale("en_US.UTF-8"));
string s {"Каждый охотник желает знать где сидит фазан."};
regex re {"[А-Яа-яЁё]+"};
for (sregex_iterator it {s.begin(), s.end(), re}, end {}; it != end; it++) {
cout << it->str() << "#";
}
但是,这似乎行不通。上面的代码结果如下:
Кажд�#й#о�#о�#ник#желае�#зна�#�#где#�#иди�#�#азан#
而不是预期:
Каждый#охотник#желает#знать#где#сидит#фазан
上面“�”符号的代码是\321。
我检查了与grep 一起使用的正则表达式,它按预期工作。我的语言环境是en_US.UTF-8。 GCC 和 Clang 都产生相同的结果。
我有什么遗漏吗?有没有办法“驯服”<regex>,使其适用于西里尔字符?
【问题讨论】:
-
我不太确定,但你不应该使用
std::wstring或std::u32string、std::wregex或boost::u32regex等等吗? -
你的字符串是 utf-8 编码的吗?
-
@JohnDing 你说的完全正确。使用
wstring等人成功了。如果您不介意,我将使用这些知识很快回答我自己的问题。 -
@undercatapplaudsMonica 当然不是,继续。
标签: c++ regex locale regular-language cyrillic