Boost Split не может разбить китайское предложение

У меня есть предложение на китайском языке, я хочу разделить его китайской пунктуацией. Но это не удалось. Я использовал кодировку utf-8 в файле.

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

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

Результаты разделения:

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

Boost split не может разделить слова по-китайски? Кто-нибудь может сказать мне причину? благодарю вас.

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

Другие решения

Boost split считает, что строки рассматриваются как std :: strings: последовательности char: примерно «байты» (или, я полагаю, кодовые единицы в 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 кодовые точки, которые вы могли ожидать.

Я / думаю / помню, что в 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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector