提升分裂不能分裂中文句子

时间:2017-04-05 06:29:05

标签: c++ boost split chinese-locale

我有一个中文句子,我想用中文标点分开。但它失败了。我在文件中使用了utf-8编码。

std::string src = "使用boost split失败了,不知道什么原因。有人可以告诉我吗?谢谢!";

boost::split(results, src, boost::is_any_of(",.,。"));

拆分结果是:

["使用boost split失败了", "", "", "不知道�", "么原因", "", "", "有人可以告诉我吗", "", "�谢谢", "", "�"]

Boost拆分不能用中文拆分?有人可以告诉我原因吗?谢谢。

2 个答案:

答案 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

集成使用