我有一个中文句子,我想用中文标点分开。但它失败了。我在文件中使用了utf-8编码。
std::string src = "使用boost split失败了,不知道什么原因。有人可以告诉我吗?谢谢!";
boost::split(results, src, boost::is_any_of(",.,。"));
拆分结果是:
["使用boost split失败了", "", "", "不知道�", "么原因", "", "", "有人可以告诉我吗", "", "�谢谢", "", "�"]
Boost拆分不能用中文拆分?有人可以告诉我原因吗?谢谢。
答案 0 :(得分:1)
我发现C ++ 11正则表达式可以解决这个问题:
std::regex regex(",|。|!|?");
std::string src = "使用boost split失败了,不知道什么原因。有人可以告诉我吗?谢谢!";
std::sregex_token_iterator iterator(src.begin(), src.end(), regex, -1);
std::sregex_token_iterator end;
for ( ; iterator != end; ++iterator) {
std::string res = *iterator;
std::cout << res << std::endl;
}
results:
使用boost split失败了
不知道什么原因
有人可以告诉我吗
谢谢
为什么提升不能?我使用了错误的方法吗?
答案 1 :(得分:1)
Boost split think将字符串视为std :: strings:char
的序列:大致&#34;字节&#34; (或者我认为是UTF-8中的代码单元。)
但是,源/模式中的许多代码点都是多字节字符,这实际上是什么(假设UTF-8源文件):
std::string src {
0xe4, 0xbd, 0xbf, 0xe7, 0x94, 0xa8, 0x62, 0x6f, 0x6f, 0x73, 0x74, 0x20,
0x73, 0x70, 0x6c, 0x69, 0x74, 0xe5, 0xa4, 0xb1, 0xe8, 0xb4, 0xa5, 0xe4,
0xba, 0x86, 0xef, 0xbc, 0x8c, 0xe4, 0xb8, 0x8d, 0xe7, 0x9f, 0xa5, 0xe9,
0x81, 0x93, 0xe4, 0xbb, 0x80, 0xe4, 0xb9, 0x88, 0xe5, 0x8e, 0x9f, 0xe5,
0x9b, 0xa0, 0xe3, 0x80, 0x82, 0xe6, 0x9c, 0x89, 0xe4, 0xba, 0xba, 0xe5,
0x8f, 0xaf, 0xe4, 0xbb, 0xa5, 0xe5, 0x91, 0x8a, 0xe8, 0xaf, 0x89, 0xe6,
0x88, 0x91, 0xe5, 0x90, 0x97, 0xef, 0xbc, 0x9f, 0xe8, 0xb0, 0xa2, 0xe8,
0xb0, 0xa2, 0xef, 0xbc, 0x81
};
boost::split(results, src, boost::is_any_of({
0x2c, 0x2e, 0xef, 0xbc, 0x8c, 0xe3, 0x80, 0x82
}));
如您所见,它分为8个字节(0x2c,0x2e,0xef,0xbc,0x8c,0xe3,0x80,0x82)中的任何一个,而不是您可能期望的4个代码点。
I / think /我记得Boost Regex有更多的UNICODE支持,除了你可以尝试将所有字符串转换为UTF32并使用你已经使用过的算法。请参阅http://www.boost.org/doc/libs/1_63_0/libs/regex/doc/html/boost_regex/unicode.html
您只能搜索编码为宽字符序列的字符串,无法在许多平台上搜索UTF-8甚至UTF-16。
看起来你应该转换为UTF32。或者,您可以将ICU与boost :: u32regex
集成使用