2016-11-10 9 views
0

Когда я использую set_word_breaks_utf32() из библиотеки libunibreak для перемещения по словам, я вижу, что однословные слова (т.е. «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; 
} 

Выходной сигнал этого кода ясно показывает, что буква «а» неотличима от окружающего пробельных:

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() does is find every word рубеж.

This is a test. 
1110010000111000 

    T h i s ' ' i s ' ' a ' ' t e s t . '\n' 
| _ _ _ | | _ | | | | _ _ _ | | | 

Каждый | выше границы слова, которое может быть полезно, чтобы найти слова, но это не полное решение. Обратите внимание, что в начале строки есть неявная граница слова. Алгоритм полного определения слова должен будет определить, является ли символ между каждой смежной границей слов буквой юникода и соответствующим образом помечать этот символ как слово.

+0

Благодарим вас за ответ. Мне кажется, что Приложение № 29 предназначено для текстовой навигации на основе раздела 4 документа: «Границы Word используются в нескольких разных контекстах. Наиболее знакомыми являются выбор (двойной щелчок мыши или« переход на следующее слово «клавиши управления-стрелки» ... «Возможно, вы пытались сказать, что' set_word_breaks_utf32() 'не предназначен для этого? Но ваше объяснение вывода было очень полезно, как и ваше объяснение, что я должен проверять символы между смежными границами слов. Вы знаете, может ли libunibreak помочь с этим? –

+0

Я вижу, что libunibreak имеет внутреннюю функцию 'get_char_wb_class()', которая может использоваться с внутренней таблицей 'wb_prop_default'. Интересно, почему эта функция или что-то подобное не подвергается пользователю, поскольку она, похоже, обеспечит вторую половину необходимой мне функциональности. –

+0

Я скопировал 'get_char_wb_class()' и 'wb_prop_default' и завернул смежную логику границы слова в мой существующий код. Навигация по словам теперь ведет себя правильно. –