En attendant UTF8

Une application correctement internationalisée ne doit pas faire de suppositions sur le nombre d'octets par caractère. Cela signifie que vous ne devez pas faire d'arithmétique de pointeurs pour cheminer parmi les caractères d'une chaîne ; cela signifie aussi que vous ne devez pas vous servir d'objets std::string ou de fonctions C standard telles que strlen() car elle se fondent sur de telles suppositions pour effectuer leurs calculs.

Même si vous avez certainement déjà délaissé les tableaux de char* vides et l'arithmétique des pointeurs en vous servant de std::string, vous devez maintenant utiliser à la place des objets Glib::ustring. Voyez le chapitre concernant les Glib::ustring dans les Fondamentaux.

XXVII.III.I. Glib::ustring et std::iostreams

Malheureusement, l'intégration avec les flux d'entrée-sortie standards n'est pas d'une utilisation très simple. Si vous dirigez la sortie du flux standard vers un ostream avec l'opérateur operator<<, gtkmm convertit les Glib::ustring dans un encodage spécifique à l'environnement linguistique (qui généralement n'est pas UTF-8). De la même façon, en récupérant des objets Glib::ustring à partir d'un flux istream avec l'opérateur operator>>, vous déclenchez la conversion inverse. Mais ce schéma s'effondre si vous passez par un std::string, par exemple en dirigeant un flux de texte vers un std::string puis en le convertissant de manière implicite en Glib::ustring. Si la chaîne contenait des caractères non-ASCII et que l'environnement linguistique local n'est pas codé en UTF-8, il en résulte un objet Glib::ustring corrompu. Vous pouvez contourner ce problème avec une conversion manuelle. Par exemple, pour retrouver l'objet std::string à partir d'un ostringstream :

std::ostringstream output;
output.imbue(std::locale("")); // utiliser la locale de l'utilisateur pour ce flux
output << percentage << " % done";
label->set_text(Glib::locale_to_utf8(output.str()));