如何获得GtkTextBuffer的精确大小(以字节为单位)?

如何获得GtkTextBuffer的精确大小(以字节为单位)?,gtk,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\u te

目前,我正在这样做:

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\u text\u iter\u get\u offset()
,但它返回的是字符大小,而不是物理字节。

不幸的是,没有相应的
gtk\u text\u buffer\u get\u byte\u count()
gtk\u text\u iter\u get\u 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);

我并不认为这并不难看。

由于GTK+根据定义将所有文本存储在UTF-8中,因此我认为您获得字符指针并使用简单的旧strlen()的解决方案非常棒

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

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”不是无效的UTF-8:某些GTK+API还提供了允许嵌入NUL字节的长度参数。@ntd:有趣。但是否有可能在GtkTextBuffer中键入(或以其他方式导致)NUL字节?@unwind:我不知道,NUL处理仍然是一个悬而未决的问题。我怀疑嵌入一个NUL字节,虽然是有效的UTF8,但无论如何都会破坏很多代码。我的评论是学术性的,而不是实践性的。