<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Expecting UTF8</title> <link rel="stylesheet" type="text/css" href="style.css"> <meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> <link rel="home" href="index.html" title="Programming with gtkmm 3"> <link rel="up" href="chapter-internationalization.html" title="Chapter 27. Internationalization and Localization"> <link rel="prev" href="sec-i18n-marking-strings.html" title="Marking strings for translation"> <link rel="next" href="sec-i18n-pitfalls.html" title="Pitfalls"> </head> <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> <div class="navheader"> <table width="100%" summary="Navigation header"> <tr><th colspan="3" align="center">Expecting UTF8</th></tr> <tr> <td width="20%" align="left"> <a accesskey="p" href="sec-i18n-marking-strings.html"><img src="icons/prev.png" alt="Prev"></a> </td> <th width="60%" align="center">Chapter 27. Internationalization and Localization</th> <td width="20%" align="right"> <a accesskey="n" href="sec-i18n-pitfalls.html"><img src="icons/next.png" alt="Next"></a> </td> </tr> </table> <hr> </div> <div class="sect1"> <div class="titlepage"><div><div><h2 class="title" style="clear: both"> <a name="sec-i18n-expecting-utf8"></a>Expecting UTF8</h2></div></div></div> <p> A properly internationalized application will not make assumptions about the number of bytes in a character. That means that you shouldn't use pointer arithmetic to step through the characters in a string, and it means you shouldn't use <code class="classname">std::string</code> or standard C functions such as <code class="function">strlen()</code> because they make the same assumption. </p> <p> However, you probably already avoid bare char* arrays and pointer arithmetic by using <code class="classname">std::string</code>, so you just need to start using <code class="classname">Glib::ustring</code> instead. See the <a class="link" href="sec-basics-ustring.html" title="Glib::ustring">Basics</a> chapter about <code class="classname">Glib::ustring</code>. </p> <div class="sect2"> <div class="titlepage"><div><div><h3 class="title"> <a name="i18n-ustring-iostreams"></a>Glib::ustring and std::iostreams</h3></div></div></div> <p> Unfortunately, the integration with the standard iostreams is not completely foolproof. <span class="application">gtkmm</span> converts <code class="classname">Glib::ustring</code>s to a locale-specific encoding (which usually is not UTF-8) if you output them to an <code class="classname">ostream</code> with <code class="function">operator<<</code>. Likewise, retrieving <code class="classname">Glib::ustrings</code> from <code class="classname">istream</code> with <code class="function">operator>></code> causes a conversion in the opposite direction. But this scheme breaks down if you go through a <code class="classname">std::string</code>, e.g. by inputting text from a stream to a <code class="classname">std::string</code> and then implicitly converting it to a <code class="classname">Glib::ustring</code>. If the string contained non-ASCII characters and the current locale is not UTF-8 encoded, the result is a corrupted <code class="classname">Glib::ustring</code>. You can work around this with a manual conversion. For instance, to retrieve the <code class="classname">std::string</code> from a <code class="classname">ostringstream</code>: </p> <pre class="programlisting">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()));</pre> <p> </p> </div> </div> <div class="navfooter"> <hr> <table width="100%" summary="Navigation footer"> <tr> <td width="40%" align="left"> <a accesskey="p" href="sec-i18n-marking-strings.html"><img src="icons/prev.png" alt="Prev"></a> </td> <td width="20%" align="center"><a accesskey="u" href="chapter-internationalization.html"><img src="icons/up.png" alt="Up"></a></td> <td width="40%" align="right"> <a accesskey="n" href="sec-i18n-pitfalls.html"><img src="icons/next.png" alt="Next"></a> </td> </tr> <tr> <td width="40%" align="left" valign="top">Marking strings for translation </td> <td width="20%" align="center"><a accesskey="h" href="index.html"><img src="icons/home.png" alt="Home"></a></td> <td width="40%" align="right" valign="top"> Pitfalls</td> </tr> </table> </div> </body> </html>