2009-12-19 31 views
1

目前我正在做它喜歡:如何獲得以字節爲單位的GtkTextBuffer的確切大小?

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

不幸的是,沒有相應的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

由於GTK +按照定義存儲了UTF-8的所有文本,我認爲你的解決方案可以獲得指向字符的指針並使用普通的舊版本strlen()是非常棒的。

UTF-8保證不會發生值爲0的字節,所以strlen()將執行正確的計數操作並返回緩衝區的長度(以字節爲單位)。另外,這是一個經典的C運行時功能,它是衆所周知的,並且可能儘可能高度優化。

+0

'\ 0'_is not_valid UTF-8:http://www.mail-archive.com/[email protected]/msg08985.html 某些GTK + API尚未提供長度參數以允許嵌入NUL字節。 – ntd 2009-12-21 19:37:17

+0

@ntd:有趣。但是是否可以鍵入(或以其他方式導致)一個NUL字節出現在GtkTextBuffer中? – unwind 2009-12-25 17:06:51

+0

@unwind:我不知道,NUL處理仍然是一個懸而未決的問題。我懷疑嵌入一個NUL字節,儘管有效的UTF8,無論如何將打破大量的代碼。我的評論比實際更具學術性。 – ntd 2010-01-06 16:06:49

相關問題