Let’s say you need to write an XML file with this content:
<span class="pln" style="margin: 0px; padding: 0px;">< ?xml version="1.0" encoding="UTF-8"? ><br style="margin: 0px; padding: 0px;" />< root description="this is a naïve example" ><br style="margin: 0px; padding: 0px;" />< /root ></span>
How do we write that in C++?
At a first glance, you could be tempted to write it like this:
<span class="com" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0);">#include</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="margin: 0px; padding: 0px;"> fstream </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">></span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /></span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="margin: 0px; padding: 0px;"> main</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ofstream testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">open</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"demo.xml"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">out</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">binary</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"> <br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">string</span><span class="pln" style="margin: 0px; padding: 0px;"> text </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n"</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< root description=\"this is a naïve example\" >\n< /root >"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><<</span><span class="pln" style="margin: 0px; padding: 0px;"> text</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">close</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">}</span>
When you open the file in IE for instance, surprize! It's not rendered correctly:
So you could be tempted to say "let's switch to wstring and wofstream".
<span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="margin: 0px; padding: 0px;"> main</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">wofstream testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">open</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"demo.xml"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">out</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">binary</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"> <br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">wstring text </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> L</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n"</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> L</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< root description=\"this is a naïve example\" >\n< /root >"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><<</span><span class="pln" style="margin: 0px; padding: 0px;"> text</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">close</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">}</span>
And when you run it and open the file again, no change. So, where is the problem? Well, the problem is that neither ofstream nor wofstream write the text in a UTF-8 format. If you want the file to really be in UTF-8 format, you have to encode the output buffer in UTF-8. And to do that we can use WideCharToMultiByte(). This Windows API maps a wide character string to a new character string (which is not necessary from a multibyte character set). The first argument indicates the code page. For UTF-8 we need to specify CP_UTF8.
The following helper functions encode a std::wstring into a UTF-8 stream, wrapped into a std::string.
<span class="com" style="margin: 0px; padding: 0px; color: rgb(136, 0, 0);">#include</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="margin: 0px; padding: 0px;"> windows</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">h </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">></span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">string</span><span class="pln" style="margin: 0px; padding: 0px;"> to_utf8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">wchar_t</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="margin: 0px; padding: 0px;"> buffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="margin: 0px; padding: 0px;"> len</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="margin: 0px; padding: 0px;"> nChars </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="typ" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102);">WideCharToMultiByte</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> CP_UTF8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> buffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> len</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> NULL</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> NULL</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> NULL</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">if</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;">nChars </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">==</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">""</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">string</span><span class="pln" style="margin: 0px; padding: 0px;"> newbuffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> newbuffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">resize</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;">nChars</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="typ" style="margin: 0px; padding: 0px; color: rgb(102, 0, 102);">WideCharToMultiByte</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> CP_UTF8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> buffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> len</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">const_cast</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">char</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">*</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">>(</span><span class="pln" style="margin: 0px; padding: 0px;">newbuffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">c_str</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">()),</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> nChars</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> NULL</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> NULL</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"> <br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> newbuffer</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">}</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" />std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">string</span><span class="pln" style="margin: 0px; padding: 0px;"> to_utf8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">const</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">wstring</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">&</span><span class="pln" style="margin: 0px; padding: 0px;"> str</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> to_utf8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;">str</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">c_str</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(),</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">)</span><span class="pln" style="margin: 0px; padding: 0px;">str</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">size</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">());</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">}</span>
With that in hand, all you have to do is doing the following changes:
<span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">int</span><span class="pln" style="margin: 0px; padding: 0px;"> main</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">()</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">{</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ofstream testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">open</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"demo.xml"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">,</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">out</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">|</span><span class="pln" style="margin: 0px; padding: 0px;"> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">ios</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">binary</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"> <br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="pln" style="margin: 0px; padding: 0px;">wstring text </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> L</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n"</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /> L</span><span class="str" style="margin: 0px; padding: 0px; color: rgb(0, 136, 0);">"< root description=\"this is a naïve example\" >\n< /root >"</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> std</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">::</span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">string</span><span class="pln" style="margin: 0px; padding: 0px;"> outtext </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">=</span><span class="pln" style="margin: 0px; padding: 0px;"> to_utf8</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">(</span><span class="pln" style="margin: 0px; padding: 0px;">text</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">);</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile </span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);"><<</span><span class="pln" style="margin: 0px; padding: 0px;"> outtext</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> testFile</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">.</span><span class="pln" style="margin: 0px; padding: 0px;">close</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">();</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /><br style="margin: 0px; padding: 0px;" /> </span><span class="kwd" style="margin: 0px; padding: 0px; color: rgb(0, 0, 136);">return</span><span class="pln" style="margin: 0px; padding: 0px;"> </span><span class="lit" style="margin: 0px; padding: 0px; color: rgb(0, 102, 102);">0</span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">;</span><span class="pln" style="margin: 0px; padding: 0px;"><br style="margin: 0px; padding: 0px;" /></span><span class="pun" style="margin: 0px; padding: 0px; color: rgb(102, 102, 0);">}</span>
And now when you open the file, you get what you wanted in the first place.
原文:http://mariusbancila.ro/blog/2008/10/20/writing-utf-8-files-in-c/