2009-12-19 4 views
1

À l'heure actuelle, je le fais comme:Comment obtenir une taille exacte d'un GtkTextBuffer en octets?

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 

Mais ceci est plutôt laid. J'ai trouvé (et testé) gtk_text_iter_get_offset() mais il renvoie la taille en caractères , pas d'octets physiques.

Répondre

0

Il n'y a pas fonction gtk_text_buffer_get_byte_count() ou gtk_text_iter_get_index() correspondante, malheureusement. Si vous avez besoin d'une limite supérieure absolue sur le nombre d'octets requis pour stocker le texte tampon, vous pouvez prendre la valeur de gtk_text_buffer_get_char_count() et la multiplier par 4, le nombre maximal d'octets requis pour encoder un caractère UTF-8. Si elle est l'allocation et désaffecter une chaîne contenant le texte intégral du tampon que vous êtes inquiet, vous pouvez faire ce qui suit:

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); 

Je ne prétends pas que ce n'est pas laid.

2

Depuis GTK + stocke tous les textes en UTF-8 par définition, je pense que votre solution pour obtenir un pointeur sur les caractères et utiliser un vieux strlen() plaine est génial.

UTF-8 garantit que l'octet de valeur 0 ne se produit pas, de sorte que strlen() effectuera l'opération de comptage adéquate et retourne la longueur du tampon en octets. De plus, c'est une fonction d'exécution C classique bien connue et très probablement aussi hautement optimisée que possible.

+0

'\ 0' _est not_ UTF-8 invalides: http://www.mail-archive.com/[email protected]/msg08985.html Certaines API GTK + fournit encore le paramètre de longueur pour permettre l'incorporation des octets NUL. – ntd

+0

@ntd: Intéressant. Mais est-il possible de taper (ou sinon provoquer) un octet NUL pour apparaître dans un GtkTextBuffer? – unwind

+0

@unwind: Je ne sais pas, la gestion NUL est toujours un problème ouvert. Je suppose que l'incorporation d'un octet NUL, bien que valide UTF8, va casser beaucoup de code de toute façon. Mon commentaire était plus académique que pratique. – ntd

Questions connexes