LINUX.ORG.RU

GTK+ / маленький вопрос


0

0

/*
Ниже представлена функция, при запуске которой открывается окно,
в котором отображается текстовый файл, имя которого должно быть
задано в качестве параметра функции.

Все работает, но есть небольшая неприятность - при попытке открыть
текст с кириллицей (в utf8), в консоль выбрасываются сообщения типа
(myprogram:3513): Gtk-CRITICAL **: file gtktextbuffer.c: line 543 (gtk_text_buffer_emit_insert): assertion `g_utf8_validate (text, len, NULL)' failed

Быть может кто-нибудь знает, как это лечится?

ps локаль - utf8
*/

void FViewer(char *file_path){
GtkWidget *wnd, *scrolled_window;

scrolled_window = gtk_scrolled_window_new (NULL, NULL);
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

wnd = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_window_set_default_size (GTK_WINDOW (wnd), 800, 600);
gtk_window_set_position(GTK_WINDOW (wnd), GTK_WIN_POS_CENTER);

gtk_window_set_title (GTK_WINDOW (wnd), "File viewer");

int workfile = -1;
GtkTextBuffer *buffer;
GtkWidget *text_view = gtk_text_view_new ();
gtk_text_view_set_editable(GTK_TEXT_VIEW(text_view), FALSE); //нельзя редактировать
gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(text_view), FALSE); //нет курсора

buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view)); //вытаскием буфер

int rval;
void *cbuffer = calloc(512,sizeof(char));
GtkTextIter iter; // Итератор текстового буфера

/* Открываем файл. */
workfile = open (file_path, O_RDONLY);
if(workfile == -1){
g_print ("Error open %s\n", file_path);
}else{
gtk_text_buffer_get_start_iter (buffer, &iter); //Устанавливаем итератор на начало текста
while ((rval = read(workfile, cbuffer, 512)) != 0){ // Читаем из файла пишем в буфер
gtk_text_buffer_insert (buffer, &iter, cbuffer, -1);
}
free (cbuffer);
gtk_container_add (GTK_CONTAINER (scrolled_window), text_view);
gtk_container_add (GTK_CONTAINER (wnd), scrolled_window);
gtk_widget_show_all (wnd);
}
}


Так понятно, что происходит. utf текст по 2 байта идет. Когда читаем 512 байт, последний символ отрезается по байту и текст становится некорректным. Нужно здесь использовать другой способ, например, g_file_get_contents, или самому контролировать текст на правильность, и, в нужно случае отрезать его.

Да, и еще, нужно помнить, что utf8 символ по максимуму может быть 6 байт. А, кроме того, не нужно доверять пользователю, что текст в utf8, можно посмотреть н локаль и перекодировать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.