当我使用libunibreak库中的set_word_breaks_utf32()
来浏览单词时,我看到单字母单词(即英文中的'a',中文中的'北',......)消失,因为它们总是评估为WORDBREAK_BREAK因此无法与周围的空白区分开来。以下代码演示了此问题:
#include <stdio.h>
#include "wordbreak.h"
int main(int argc, const char* argv[]) {
int i;
uint32_t text[] = { 'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 't', 'e', 's', 't', '.', '\n' };
char breaks[1024];
size_t length = sizeof(text) / sizeof(text[0]);
set_word_breaks_utf32(text, length, "", breaks);
for(i = 0; i < length; i++) putchar(text[i]);
for(i = 0; i < length; i++) putchar(breaks[i] + '0');
putchar('\n');
return 0;
}
此代码的输出清楚地表明字母'a'与周围的空白无法区分:
This is a test.
1110010000111000
我可以做些什么来确保set_word_breaks_utf32()
输出中可以区分单字母单词的边界?
[使用line-breaks
标记的道歉,但word-break
标记与CSS属性相关。]
答案 0 :(得分:2)
Unicode Standard Annex #29并非真正为此而设计。 set_wordbreaks_utf32()
做的是找到每个字边界。
This is a test.
1110010000111000
T h i s ' ' i s ' ' a ' ' t e s t . '\n'
| _ _ _ | | _ | | | | _ _ _ | | |
上面的每个|
都是一个单词边界,这有助于查找单词,但不是完整的解决方案。请注意,在字符串的开头有一个隐含的单词边界。完整的单词检测算法必须确定每个相邻单词边界之间的字符是否为unicode字母,并相应地将该字符标记为单词。