目前我这样做:
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()
但它返回字符中的大小,而不是物理字节。
答案 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;}