Korzystanie z przykładowego kodu z the boost::locale documentation, nie mogę uzyskać następujące poprawnie tokenize tekst chiński:Korzystanie boost :: analizy granicznej locale/ICU z chińskim
using namespace boost::locale::boundary;
boost::locale::generator gen;
std::string text="中華人民共和國";
ssegment_index map(word,text.begin(),text.end(),gen("zh_CN.UTF-8"));
for(ssegment_index::iterator it=map.begin(),e=map.end();it!=e;++it)
std::cout <<"\""<< * it << "\", ";
std::cout << std::endl;
Dzieli 中華人民共和國 na siedem odrębnych znaków 中 /華/人/民/共/和/國, zamiast 中華/人民/共和國 zgodnie z oczekiwaniami. The documentation of ICU, na którym kompiluje się Boost, twierdzi, że chiński powinien działać po wyjęciu z pudełka i użyć słownika na bazie słownika, aby poprawnie podzielić frazy. Na przykładowym japońskim teście "生 き る か 死 ぬ か, そ れ が 問題 だ." W powyższym kodzie za pomocą "ja_JP.UTF-8" locale działa, ale tokenizacja nie zależy od słownika, tylko w kanji/granice kana.
Próbowałem tego samego kodu bezpośrednio w ICU, jak sugeruje here, ale wyniki są takie same.
UnicodeString text = "中華人民共和國";
UErrorCode status = U_ZERO_ERROR;
BreakIterator* bi = BreakIterator::createWordInstance(Locale::getChinese(), status);
bi->setText(text);
int32_t p = bi->first();
while (p != BreakIterator::DONE) {
printf("Boundary at position %d\n", p);
p = bi->next();
}
delete bi;
Każdy pomysł, co robię źle?