我正在使用ICU的字符和单词的中断迭代器,如here中所述。我希望字符断开迭代器的输出更频繁地停止,断点是字断点迭代器的超集。例如,如果我通过abc
,我会从字符断开迭代器中获取a
,b
和c
,而我从字断开迭代器获取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())