Glib::ustring

Možná budete překvapeni, že gtkmm nepoužívá ve svých rozhraních std::string. Místo toho používá Glib::ustring, který je ale natolik podobný a nenápadný, že klidně můžete předstírat, že Glib::ustring je std::string a zbytek kapitoly ignorovat. Přečtěte si ji ale, pokud chcete ve svých aplikacích používat jiné jazyky, než jen angličtinu.

std::string uses 8 bits per character, but 8 bits aren't enough to encode languages such as Arabic, Chinese, and Japanese. Although the encodings for these languages have been specified by the Unicode Consortium, the C and C++ languages do not yet provide any standardised Unicode support for UTF-8 encoding. GTK and GNOME chose to implement Unicode using UTF-8, and that's what is wrapped by Glib::ustring. It provides almost exactly the same interface as std::string, along with automatic conversions to and from std::string.

Jednou z východ UTF-8 je, že jej nemusíte používat, když jej nechcete, a nemusíte tak opravovat veškerý kód naráz. std::string bude stále fungovat pro řetězce se 7bitovým ASCII. Když se ale rozhodnete lokalizovat své aplikace do jazyků, jako je čeština nebo čínština, začnou se objevovat zvláštní chyby a případně i zhroucení. Potom vše, co musíte udělat, je začít používat místo něj Glib::ustring.

Mějte ale na paměti, že UTF-8 není kompatibilní s 8bitovými kódováními, jako je ISO-8859-2. Například ypsilon s čárkou není v ASCII a potřebuje proto v UTF-8 k zakódování víc než jeden bajt. Pokud váš kód obsahuje 8bitové řetězcové literály, musíte je převést do UTF-8 (např. český pozdrav „Dobrý den“ by byl „Dobr\xC3\xBD den“).

Měli byste se vyvarovat ukazatelové aritmetiky ve stylu C a funkcí jako je strlen(). V UTF-8 mohou znaky zabírat od 1 do 6 bajtů, takže se nedá automaticky předpokládat, že následující bajt je jiný znak. Glib::ustring se o tyto věci postará, takže můžete používat metody jako je Glib::ustring::substr() a přitom stále uvažovat v intencích znaků, ale ne bajtů.

Na rozdíl od řešení Unikódu v podobě UCS-2 ve Windows, nejsou zapotřebí žádné speciální volby kompilátoru pro zpracování řetězcových literálů a nevznikají tak spustitelné programy a knihovny s podporou Unikódu, které by byly nekompatibilní s ASCII.

Reference

Více informací o poskytování řetězcových literálů v UTF-8 viz kapitola Internacionalizace.