如何以字节为单位获取GtkTextBuffer的确切大小?

时间:2009-12-19 21:05:11

标签: gtk

目前我这样做:

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

答案 0 :(得分:2)

由于GTK +按照定义将所有文本存储在UTF-8中,我认为获取指向字符的指针并使用普通旧strlen()的解决方案非常棒。

UTF-8保证不会发生值为0的字节,因此strlen()将执行正确的计数操作并以字节为单位返回缓冲区的长度。此外,它是一个经典的C运行时功能,它是众所周知的,并且很可能尽可能高度优化。

答案 1 :(得分:0)

遗憾的是,没有相应的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);

我并不认为这不丑陋。

答案 2 :(得分:0)

strlen()在遇到的第一个空格处停止。 我建议修改版本:

short int strlen_0(char *s)
{ short int i=0;
  if (s!=NULL)
     {while (*(s+i)!='\0') i++;
      return i;}
  else return -1;}