我正在尝试使用libunibreak(https://github.com/adah1972/libunibreak)来标记某些给定的unicode文本中可能的换行符.
Libunibreak在某些文本中为每个代码单元返回了四个可能的选项:
LINEBREAK_MUSTBREAK LINEBREAK_ALLOWBREAK LINEBREAK_NOBREAK LINEBREAK_INSIDEACHAR
希望这些是自我解释的.我希望MUSTBREAK对应于像LF这样的换行符.但是,对于任何给定的文本,Libunibreak始终指示最后一个字符是MUSTBREAK
例如,使用字符串"abc",输出将是[NOBREAK,NOBREAK,MUSTBREAK].对于"abc \n",输出将是[NOBREAK,NOBREAK,NOBREAK,MUSTBREAK].我在绘制文本时使用MUSTBREAK属性开始一个新行,因此第一个案例("abc")创建了一个不应该存在的额外换行符.
这是Unicode指定的行为,还是我正在使用的库实现的怪癖?
是的,这是Unicode换行算法指定的内容.UAX#14中的规则LB3 :Unicode断行算法,第6.1节"不可裁剪的断行规则"说:
总是在文本末尾打破.
该规范进一步解释:
[此规则]旨在处理退化情况,因此整个文本至少有一个换行符.