如何获得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,但无论如何都会破坏很多代码。我的评论是学术性的,而不是实践性的。