Glib::ustring
Det kanske förvånar dig att höra att gtkmm inte använder std::string i sina gränssnitt. I stället använder det Glib::ustring vilket är snarlikt och inte gör något väsen av sig, så du skulle kunna låtsas att varje Glib::ustring är en std::string och ignorera resten av detta avsnitt. Men läs vidare om du vill använda andra språk än engelska i ditt program.
std::string använder 8 bitar per tecken, men 8 bitar räcker inte till för att koda språk som arabiska, kinesiska och japanska. Även om kodningarna för dessa språk har angivits av Unicode Consortium så tillhandahåller språken C och C++ ännu inte något standardiserat Unicode-stöd för UTF-8-kodning. GTK och GNOME valde att implementera Unicode med UTF-8, och det är vad som är omslaget av Glib::ustring. Det tillhandahåller nästan exakt samma gränssnitt som std::string, tillsammans med automatiska konverteringar till och från std::string.
En av fördelarna med UTF-8 är att du inte behöver använda det om du inte vill, så du behöver inte skriva om all din kod på en gång. std::string kommer fortfarande fungera för 7-bitars ASCII-strängar. Men när du försöker lokalanpassa ditt program för språk som exempelvis kinesiska kommer du börja se märkliga fel och möjligen krascher. Då är allt du behöver göra att börja använda Glib::ustring i stället.
Observera att UTF-8 inte är kompatibelt med 8-bitars kodningar som ISO-8859-1. Exempelvis finns tyska omljud inte i ASCII-intervallet och behöver mer än 1 byte i UTF-8-kodningen. Om din kod innehåller 8-bitars stränglitteraler behöver du konvertera dem till UTF-8 (t.ex. skulle den bayerska hälsningen ”Grüß Gott” bli ”Gr\xC3\xBC\xC3\x9F Gott”).
Du bör undvika pekararitmetik av C-stil och funktioner som strlen(). I UTF-8 kan varje tecken behöva vad som helst från 1 till 6 byte, så det är inte möjligt att anta att nästa byte är ett nytt tecken. Glib::ustring sköter detaljerna kring detta åt dig, så du kan använda metoder som Glib::ustring::substr() och tänka på antal tecken i stället för byte.
Till skillnad från Windows Unicode-lösning UCS-2 så kräver detta inte några ytterligare kompilatorflaggor för att behandla stränglitteraler, och det resulterar inte i körbara Unicode-program och bibliotek som är inkompatibla med de som använder ASCII.
Se avsnittet Internationalisering för information om hur du tillhandahåller UTF-8-stränglitteralerna.