Как получить точный размер GtkTextBuffer в байтах? - PullRequest
1 голос
/ 20 декабря 2009

В настоящее время я делаю это как:

GtkTextBuffer *buf = gtk_text_view_get_buffer(...);
gtk_text_buffer_get_bounds(buf, &start, &end);
gchar *data = gtk_text_buffer_get_text(buf, &start, &end, true);
gint size = strlen(data); // ouch

Но это довольно уродливо. Я нашел (и протестировал) gtk_text_iter_get_offset(), но он возвращает размер символов , а не физических байтов.

Ответы [ 3 ]

2 голосов
/ 21 декабря 2009

Поскольку GTK + сохраняет весь текст в UTF-8 по определению, я думаю, что ваше решение получить указатель на символы и использовать обычный старый strlen() - это круто.

UTF-8 гарантирует, что байт со значением 0 не встречается, поэтому strlen() выполнит правильную операцию подсчета и вернет длину буфера в байтах. Кроме того, это классическая функция времени выполнения C, которая хорошо известна и, вероятно, максимально оптимизирована.

0 голосов
/ 06 октября 2018

strlen () останавливается при первом обнаружении пробела. Я предлагаю модифицированную версию:

short int strlen_0(char *s)
{ short int i=0;
  if (s!=NULL)
     {while (*(s+i)!='\0') i++;
      return i;}
  else return -1;}
0 голосов
/ 20 декабря 2009

К сожалению, нет соответствующей функции gtk_text_buffer_get_byte_count() или gtk_text_iter_get_index(). Если вам нужна абсолютная верхняя граница количества байтов, необходимого для хранения текста буфера, вы можете взять значение из gtk_text_buffer_get_char_count() и умножить его на 4, максимальное количество байтов, необходимое для кодирования одного символа UTF-8. Если он выделяет и освобождает строку, содержащую полный текст буфера, который вас беспокоит, вы можете сделать следующее:

glong bytecount = 0;
GtkTextIter iter;
for(gtk_text_buffer_get_start_iter(buf, &iter); gtk_text_iter_forward_line(&iter); )
    bytecount += gtk_text_iter_get_bytes_in_line(&iter);

Я не утверждаю, что это не уродливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...