怎样在C++中写UTF-8格式的内容

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:

怎样在C++中写UTF-8格式的内容_第1张图片

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/


你可能感兴趣的:(C++,utf-8)