Количество символов GTK против индекса байтов - PullRequest
2 голосов
/ 03 июля 2019

В GtkTextBuffer,

я вижу, что GTK + хранит кириллические символы в двух байтах (что меня немного смущает, я думал, что они хранят их в кодировке UTF-8, следовательно, каждый символ должен быть в пределах одногобайт?)

Это приводит к проблеме - я сканирую текст в виде строки в цикле, и мне нужно сослаться на соответствующее расположение символов на основе индекса в цикле, однако они не имеютсоответствующие индексы больше, потому что текст содержит кириллицу.Количество символов составляет 8310, а размер строки составляет около 11300.

Если я использую g_str_to_ascii() в строке, которую я сканирую, позже, когда я отображаю часть содержимого строки в деревевиджет просмотра отображает кириллические символы как ? s.

Как обойти эту проблему?


G_MODULE_EXPORT void on_textbuffer_changed (GtkTextBuffer* textbuffer, gpointer user_data)
{
    GtkTextIter start   = {0};
    GtkTextIter end     = {0};
    gchar*      text    = NULL;

    gtk_text_buffer_get_bounds(textbuffer, &start, &end);

    text = gtk_text_buffer_get_text(textbuffer, &start, &end, FALSE);

    printf("[%i][%i]\n", gtk_text_buffer_get_char_count(textbuffer), strlen(text));

    g_free(text);
}

Это выведет [1][2], если я поместу кириллический символи [2][4], если я помещу два символа кириллицы соответственно.

Это байты кириллицы "а" (char / dec):

enter image description here

1 Ответ

2 голосов
/ 03 июля 2019

Не совсем понятно, что вы хотите сделать, но если вам нужно обработать всю строку UTF-8 по одному символу Unicode за раз, могут помочь манипуляции GLib Unicode , см., Например, g_utf_next_char () и g_utf_get_char ().

Это не меняет того факта, что символы являются Unicode, поэтому могут быть многобайтовыми символами.

Если ваша цель состоит в том, чтобы иметь возможность изменять буфер на основе, например, совпадающих слов, выследует взглянуть на API GtkTextIter: в качестве примера вы можете использовать gtk_text_iter_forward_search () , чтобы получить начало и конец iters, которые вы можете использовать непосредственно в API GtkTextBuffer.Таким образом, вам никогда не придется иметь дело с реальными символами или байтовыми индексами.

...