Esperar UTF8

Una aplicación adecuadamente internacionalizada no asumirá nada sobre el número de bytes en un carácter. Eso significa que no debe usar aritmética de punteros para avanzar sobre los caracteres en una cadena, y significa que no debe usar std::string o funciones estándar de C como strlen() porque asumen lo mismo.

Sin embargo, probablemente ya evite matrices char* simples y aritmética de punteros usando std::string, por lo que sólo necesita comenzar a usar Glib::ustring en su lugar. Consulte el capítulo Conceptos básicos acerca de Glib::ustring.

27.3.1. Glib::ustring y std::iostreams

Desafortunadamente, la integración con iostreams estándar no es completamente infalible. gtkmm convierte Glib::ustring a una codificación específica de la localización (que generalmente no es UTF-8) si las dirige a un ostream con operator<<. De igual manera, recuperar Glib::ustring de istream con operator>> causa una conversión en la dirección opuesta. Pero este esquema se rompe si usa una std::string, por ejemplo introduciendo texto desde un flujo a una std::string y luego convirtiéndola implícitamente a una Glib::ustring. Si la cadena contenía caracteres no ASCII y la localización actual no está codificada en UTF-8, el resultado es una Glib::ustring corrupta. Puede solucionar temporalmente esto con una conversión manual. Por ejemplo, para recuperar la std::string de un ostringstream:

std::ostringstream output;
output.imbue(std::locale("")); // use the user's locale for this stream
output << percentage << " % done";
label->set_text(Glib::locale_to_utf8(output.str()));