2015-03-13 13 views
5

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?

Odpowiedz

1

Najprawdopodobniej używasz wersji ICU przed 5.0, która jest pierwszą wersją obsługującą słownikową chińską segmentację słów.

Należy również pamiętać, że domyślnie funkcja boost używa ICU jako lokalnego backendu, stąd wyniki dublowania.

Powiązane problemy