无法用libunibreak区分单个字符的单词

时间:2016-11-10 20:08:15

标签: c unicode line-breaks

当我使用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属性相关。]

1 个答案:

答案 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字母,并相应地将该字符标记为单词。