Utilizzando il codice di esempio da the boost::locale documentation, non può ottenere il seguente per tokenize correttamente il testo cinese:Utilizzando boost :: analisi locale/ICU confine con il cinese
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;
Questa si divide in sette 中華人民共和國 caratteri distinti 中 /華/人/民/共/和/國, piuttosto che 中華/人民/共和國 come previsto. Lo documentation of ICU, su cui Boost è compilato, afferma che il cinese dovrebbe funzionare immediatamente e utilizzare un tokenizzatore basato su dizionario per suddividere correttamente le frasi. Usando l'esempio di frase di prova giapponese "生 き る か 死 ぬ か, そ れ が 問題 だ." Nel codice sopra con la locale "ja_JP.UTF-8" fa funziona, ma questa tokenizzazione non dipende da un dizionario, solo su kanji/confini kana.
Ho provato lo stesso codice direttamente in ICU come suggerito here, ma i risultati sono gli stessi.
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;
Qualche idea di cosa sto facendo male?