将icu :: RuleBasedBreakIterator与硬编码规则一起使用

时间:2016-05-04 02:31:04

标签: c++ unicode icu southeast-asian-languages

我试图在C ++中使用ICU RuleBasedBreakIterator将老挝文本分割为音节。 ICU对泰语有相应的规则,相同但不同的规则#34; SOLR人员有something working in Java that I could get the rules from但是我找不到任何关于如何通过其构造函数直接实例化RuleBasedBreakIterator的示例,该构造函数允许我指定规则而不是BreakIterator中的工厂方法。这是我到目前为止所做的一个略微修改的函数from the ICU docs

#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;
}

然而,由于根据gdb的NULL状态表,我在调用bi->next后立即出现分段错误:

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返回代码似乎也不足以表明我可以正确使用迭代器。

我在这里缺少什么想法?

0 个答案:

没有答案