我正在尝试在 C++ 中使用 ICU RuleBasedBreakIterator 将老挝文本分割成音节。ICU对泰语有相应的规定,即“相同但不同”。SOLR 的人有一些在 Java 中工作的东西,我可以从中获取规则,但我找不到任何示例说明如何RuleBasedBreakIterator
通过其构造函数直接实例化 a,让我指定规则而不是BreakIterator
. 这是我到目前为止所拥有的,来自 ICU 文档的稍微修改的功能:
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <unicode/unistr.h>
#include <unicode/rbbi.h>
#include <unicode/chariter.h>
using namespace std;
void listWordBoundaries(const UnicodeString&);
const char RULES[] = "";
int main(int argc, char *argv[]) {
listWordBoundaries(UnicodeString::fromUTF8("ປະເທດລາວ"));
}
void listWordBoundaries(const UnicodeString& s) {
UParseError parse_error;
UErrorCode status = U_ZERO_ERROR;
RuleBasedBreakIterator* bi = new RuleBasedBreakIterator(
UnicodeString::fromUTF8(RULES), parse_error, status
);
if(!U_SUCCESS(status)) {
fprintf(stderr, "Error creating RuleBasedBreakIterator\n"); // TODO print error
if(U_MESSAGE_PARSE_ERROR == status) {
fprintf(stderr, "Parse error on line %d offset %d\n", parse_error.line, parse_error.offset);
}
exit(1);
}
bi->setText(s);
int32_t p = bi->first();
while (p != BreakIterator::DONE) {
printf("Boundary at position %d (status %d)\n", p, bi->getRuleStatus());
p = bi->next();
}
delete bi;
}
bi->next
但是,由于根据 gdb 的 NULL 状态表,我一调用就会出现分段错误:
Program received signal SIGSEGV, Segmentation fault.
icu_54::RuleBasedBreakIterator::handleNext (this=this@entry=0x614c70, statetable=0x0) at rbbi.cpp:1008
1008 UBool lookAheadHardBreak = (statetable->fFlags & RBBI_LOOKAHEAD_HARD_BREAK) != 0;
该RULES
字符串应该包含Lao.rbbi
我上面链接到的规则。我在这里省略了它,因为效果与空规则集相同。如果我在规则中添加了一些乱码,则if(!U_SUCCESS(status))
检查确实有效并且程序退出并出现错误,因此规则解析似乎有效。但是,即使U_SUCCESS
返回码似乎也不足以表明我可以正确使用迭代器。
有什么想法我在这里想念的吗?