c++ - 使用 boost::locale/ICU 边界分析与中文

标签 c++ boost icu chinese-locale boost-locale

使用 the boost::locale documentation 中的示例代码,我无法获得以下内容以正确标记中文文本:

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;

这拆分了 中華人民共和國变成七个不同的字符中/华/人/民/共/和/国,而不是预期的中华/人民/共和国。 documentation of ICU ,Boost 是针对它编译的,它声称中文应该开箱即用,并使用基于字典的分词器来正确拆分短语。在上面的代码中使用带有“ja_JP.UTF-8”区域设置的示例日语测试短语“生きるか死ぬか、そレガ问题だ。”确实有效,但此标记化不依赖于字典,仅在汉字/假名边界上。

我已经按照建议直接在 ICU 中尝试了相同的代码 here , 但结果是一样的。

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;

知道我做错了什么吗?

最佳答案

您很可能使用 5.0 之前的 ICU 版本,这是第一个支持基于字典的中文分词的版本。

另请注意,默认情况下,boost 使用 ICU 作为本地后端,因此会产生镜像结果。

关于c++ - 使用 boost::locale/ICU 边界分析与中文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29038407/

相关文章:

c++ - 为什么 cin.getline() 不起作用(C++)?

c++ - 在 C++ 中格式化 SQL 查询

c++ - 为什么 operator new 函数需要转换

sqlite - 在 SQLite 中仅使用 UTF8 编码,我可以从 ICU 数据集中删除什么?

c++ - 使用 ICU 将文本拆分为单词列表

带有 ICU 的 C++ UTF-8 输出

c++ - 为什么指针包含一些垃圾?

c++ - 为什么 boost::dynamic_bitset 是一个模板?

c++ - 允许指定单独的比较器和排序仿函数的关联容器

c++ - 由于多线程(使用 boost 库)导致的 seg 错误