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

最佳答案

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

关于c - 无法使用libunibreak区分单个字符的单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40536156/

10-11 23:11
查看更多