在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)的字节:
答案 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中使用的开始和结束迭代。这样,您将无需处理实际的字符或字节索引。