2016-11-10 28 views
0

当我使用libunibreak库中的set_word_breaks_utf32()来浏览单词时,发现单个字母单词(即英文中的'a',中文中的'北'...)消失,因为它们始终评估为WORDBREAK_BREAK,因此无法与周围的空白区分开来。下面的代码演示了这个问题:使用libunibreak无法区分单个字符

#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

为什么它是这个问题? –

+0

@Lashane我需要一次能够在文本字段中导航一个单词,而单个字母单词目前正在完全跳过,因为我从来没有看到从“WORDBREAK_NOBREAK”到“WORDBREAK_BREAK”的转换。 –

+0

为什么你使用单词中断信息来浏览单词? –

回答

1

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字母,并相应地将该字符标记为一个字。

+0

谢谢你的回答。在我看来,附件#29是用于基于文档第4部分的文字导航:“文字边界用于多种不同的情况,最熟悉的是选择(双击鼠标选择或”移动到下一个单词'control-arrow keys)...“你是否想说'set_word_breaks_utf32()'不是为此设计的?但是你对输出的解释非常有用,你的解释是我必须检查相邻单词边界之间的字符。你知道libunibreak是否可以提供帮助吗? –

+0

我看到libunibreak具有内部函数'get_char_wb_class()',它可以与内部'wb_prop_default'表一起使用。我想知道为什么这个函数或类似的东西没有暴露给用户,因为它似乎提供了我需要的另一半功能。 –

+0

我复制了'get_char_wb_class()'和'wb_prop_default',并将相邻的单词边界逻辑封装到我现有的代码中。 Word导航现在行为正确。 –