正しく国際化されたアプリケーションは一文字あたりのバイト数を仮定しません。これはつまり、文字列の中の文字を参照するのにポインタ計算を使ってはいけないということです。さらに、std::stringや標準のC関数、strlen()などを使ってはいけないということでもあります。なぜならこれらは同じ仮定をしているからです。
しかしながら、おそらく既に裸のchar*配列やポインタ計算をやめてstd::stringを使っていることでしょう。ですから、必要なことはその代わりにGlib::ustringを使うことだけです。Glib::ustringについては基礎の章を参照してください。
TODO: This section is not clear - it needs to spell things out more clearly and obviously.
残念ながら、標準のiostream族との統合具合は、完全になにをやっても大丈夫とまではいきません。Glib::ustringオブジェクトをostreamのoperator<<で出力する場合、gtkmmはこれらをロケール固有のエンコーディング(UTF-8ではないことが多い)に変換します。同様に、istreamのoperator>>を使ってGlib::ustringオブジェクトに文字列を取り出してくる場合には逆の変換が行われます。ところが、この仕組みはstd::stringが間にある場合うまくいきません。例えば、あるストリームからstd::stringにテキストを入力し、そしてこれを暗黙にGlib:ustringに変換するときです。文字列の中に非ASCII文字があり、現在のロケールがUTF-8でない場合、結果として起きるのはGlib::ustringの文字化けです。この作業はマニュアルで行ってください。例えば、ostringstreamからstd::stringを取り出してくる場合ではこうなります:
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()));