我使用icu的BreakIterator (icu 68.2)进行分词。我使用u_setDataDirectory初始化数据路径,如下面代码片段的第一行所述。但是当我检查createWordInstance()的状态时,我得到的是U_MISSING_RESOURCE_ERROR。这种错误应该通过调用u_setDataDirectory来解决。我已经用过了,但问题仍然存在。
u_setDataDirectory;
UErrorCode status = U_ZERO_ERROR;
BreakIterator *wordIterator = BreakIterator::createWordInstance(Locale("zh"), status);
if (U_FAILURE(status))
{
std::cout<<"failed to create break iterator. status = "<<u_errorName(status)<<std::endl;
exit 1;
}
UnicodeString text = "sample input string";
wordIterator->setText(text);
delete wordIterator;发布于 2022-10-05 07:06:10
如果u_setDataDirectory是导致错误的唯一原因,则必须使用指向数据目录的正确路径调用它。
将第一行更改为
u_setDataDirectory;(在Linux/Unix上)
u_setDataDirectory( "/path/to/ICU/data/" );或在Windows上
u_setDataDirectory( "C:\\Path\\To\\ICU\\Data\\" );不幸的是,我不知道ICU的数据文件在哪里。您需要将路径字符串更正为系统上正确的路径。
但是从https://unicode-org.github.io/icu-docs/apidoc/dev/icu4c/putil_8h.html#a550ea8502df5fed47ae4359be7f8e6a2文档的阅读来看,我想这还不足以解决您的问题。
如果上面的调用不能解决您的问题,您可以尝试调用u_init( UErrorCode *status )作为第一个状态:
UErrorCode status = U_ZERO_ERROR;
u_init( &status );
if (U_FAILURE(status))
{
std::cout<<"failed to init. status = "<<u_errorName(status)<<std::endl;
std::exit( 1 );
}然后检查问题出在哪里。
编辑第二个根本原因可能是缺少"Locale("zh")“。它适用于其他地区吗?比如把它改成"en_US“?
还可以通过以下方法测试区域设置是否有效:
if( Locale("zh").isBogus() )
{
std::cout << "Locale is not working!" << std::endl;
std::exit( 1 );
}https://stackoverflow.com/questions/73880279
复制相似问题