首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使在设置BreakIterator之后,也无法成功实例化u_setDataDirectory

即使在设置BreakIterator之后,也无法成功实例化u_setDataDirectory
EN

Stack Overflow用户
提问于 2022-09-28 10:56:29
回答 1查看 158关注 0票数 0

我使用icu的BreakIterator (icu 68.2)进行分词。我使用u_setDataDirectory初始化数据路径,如下面代码片段的第一行所述。但是当我检查createWordInstance()的状态时,我得到的是U_MISSING_RESOURCE_ERROR。这种错误应该通过调用u_setDataDirectory来解决。我已经用过了,但问题仍然存在。

代码语言:javascript
复制
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;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-05 07:06:10

如果u_setDataDirectory是导致错误的唯一原因,则必须使用指向数据目录的正确路径调用它。

将第一行更改为

代码语言:javascript
复制
 u_setDataDirectory;

(在Linux/Unix上)

代码语言:javascript
复制
 u_setDataDirectory( "/path/to/ICU/data/" );

或在Windows上

代码语言:javascript
复制
 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 )作为第一个状态:

代码语言:javascript
复制
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“?

还可以通过以下方法测试区域设置是否有效:

代码语言:javascript
复制
if( Locale("zh").isBogus() )
{
    std::cout << "Locale is not working!" << std::endl;
    std::exit( 1 );
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73880279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档