GTK字符数与字节索引

时间:2019-07-03 20:05:15

标签: c string encoding gtk cyrillic

在GtkTextBuffer中,

我可以看到GTK +将西里尔字符存储在两个字节中(这让我有些困惑,我认为它以UTF-8编码存储它们,因此每个字符都必须在一个字节内吗?)

这会导致一个问题-我正在循环中将字符串扫描为文本,并且需要基于循环中的索引引用适当的字符位置,但是它们不再具有相应的索引,因为文字包含西里尔字母。字符数为8310,字符串大小为11300左右。

如果我在要扫描的字符串上使用g_str_to_ascii(),稍后,当我在树形视图小部件上显示字符串的某些内容时,它将西里尔字符显示为?

如何解决这个问题?


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 个答案:

答案 0 :(得分:2)

尚不清楚要做什么,但是如果您只需要一次处理整个UTF-8字符串一个Unicode字符,则GLib Unicode manipulation函数可能会有所帮助,例如g_utf_next_char()和g_utf_get_char()。

这不会改变以下事实:字符是Unicode,因此可能是多字节字符。

如果您的目标是能够根据例如匹配的单词,您应该查看GtkTextIter API:作为示例,您可以使用gtk_text_iter_forward_search ()来获取可以直接在GtkTextBuffer API中使用的开始和结束迭代。这样,您将无需处理实际的字符或字节索引。