ICU中的单词和字符边界不一致

时间:2018-04-04 02:45:21

标签: unicode unicode-string

我正在使用ICU的字符和单词的中断迭代器,如here中所述。我希望字符断开迭代器的输出更频繁地停止,断点是字断点迭代器的超集。例如,如果我通过abc,我会从字符断开迭代器中获取abc,而我从字断开迭代器获取abc。 / p>

现在,我有一个泰语字符串ด้าน้ำ。问题是这两个break迭代器的行为是不一致的。鉴于上述字符串的长度在Unicode中为6,我在MacOS上从ICU 61.1获得这些结果:

Word boundaries:
[0, 5)
[5, 6)
Character boundaries:
[0, 2)
[2, 3)
[3, 6)

正如您所看到的,字符中断运算符会破坏[3, 6)中的单词(这似乎是正确的),而分词运算符会在[5, 6)中将其分解。这是一个使用PyICU重现问题的小Python3代码:

import PyICU

def wordBreakIterator():
    return PyICU.BreakIterator.createWordInstance(PyICU.Locale("th"))

def charBreakIterator():
    return PyICU.BreakIterator.createCharacterInstance(PyICU.Locale("th"))

def printBoundaries(txt, bi):
    bi.setText(txt)
    start = bi.first()
    try:
        while True:
            end = next(bi)
            print("[{}, {})".format(start, end))
            start = end
    except StopIteration:
        pass

if __name__ == "__main__":
    text = u'ด้าน้ำ'

    print("Word boundaries:")
    printBoundaries(text, wordBreakIterator())

    print("Character boundaries:")
    printBoundaries(text, charBreakIterator())

0 个答案:

没有答案