【问题标题】:Unable to successfully instantiate BreakIterator even after u_setDataDirectory was set即使设置了 u_setDataDirectory 也无法成功实例化 BreakIterator
【发布时间】:2022-10-05 15:06:10
【问题描述】:

我正在使用 ICU 的 BreakIterator (icu 68.2) 进行分词。 我已经使用u_setDataDirectory 来初始化数据路径,如下面的代码 sn-p\ 的第一行所述。 但是当我检查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;
  • from documentation : \"要检查构造是否成功,您应该检查 U_SUCCESS(err) 的值。\"
  • @463035818_is_not_a_number:你是对的。我得到 U_MISSING_RESOURCE_ERROR 作为状态。但我不知道为什么会这样。
  • 编辑标题以反映错误。

标签: c++ icu


【解决方案1】:

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

改变你的第一行

 u_setDataDirectory;

到(在 Linux/Unix 上)

 u_setDataDirectory( "/path/to/ICU/data/" );

或在 Windows 上

 u_setDataDirectory( "C:\\Path\\To\\ICU\\Data\\" );

不幸的是,我不知道 ICU 的数据文件在哪里。您需要将路径字符串更正为系统上的正确路径。

但是从阅读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;
   exit 1;
}

然后检查是什么问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-08-09
    • 2018-12-18
    • 2015-09-02
    • 2020-02-12
    • 2012-03-29
    相关资源
    最近更新 更多