保存文件为UTF8格式(Writing UTF-8 files in C++).
2013-03-05 11:27
176 查看
都是简单的单词,我就不翻译了。
原文地址:http://mariusbancila.ro/blog/2008/10/20/writing-utf-8-files-in-c/
Let’s say you need to write an XML file with this content:
How do we write that in C++?
At a first glance, you could be tempted to write it like this:
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".
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.
With that in hand, all you have to do is doing the following changes:
And now when you open the file, you get what you wanted in the first place.
And that is all!
原文地址:http://mariusbancila.ro/blog/2008/10/20/writing-utf-8-files-in-c/
Let’s say you need to write an XML file with this content:
< ?xml version="1.0" encoding="UTF-8"? > < root description="this is a naïve example" > < /root >
How do we write that in C++?
At a first glance, you could be tempted to write it like this:
#include< fstream > int main() { std::ofstream testFile; testFile.open("demo.xml", std::ios::out| std::ios::binary); std::string text = "< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n" "< root description=\"this is a naïve example\" >\n< /root >"; testFile << text; testFile.close(); return0; }
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".
int main() { std::wofstream testFile; testFile.open("demo.xml", std::ios::out| std::ios::binary); std::wstring text = L"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n" L"< root description=\"this is a naïve example\" >\n< /root >"; testFile << text; testFile.close(); return0; }
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.
#include< windows.h > std::string to_utf8(constwchar_t* buffer,int len) { int nChars =::WideCharToMultiByte( CP_UTF8, 0, buffer, len, NULL, 0, NULL, NULL); if(nChars ==0)return""; string newbuffer; newbuffer.resize(nChars); ::WideCharToMultiByte( CP_UTF8, 0, buffer, len, const_cast<char*>(newbuffer.c_str()), nChars, NULL, NULL); return newbuffer; } std::string to_utf8(const std::wstring& str) { return to_utf8(str.c_str(),(int)str.size()); }
With that in hand, all you have to do is doing the following changes:
int main() { std::ofstream testFile; testFile.open("demo.xml", std::ios::out| std::ios::binary); std::wstring text = L"< ?xml version=\"1.0\" encoding=\"UTF-8\"? >\n" L"< root description=\"this is a naïve example\" >\n< /root >"; std::string outtext = to_utf8(text); testFile << outtext; testFile.close(); return0; }
And now when you open the file, you get what you wanted in the first place.
And that is all!
相关文章推荐
- 保存文件为UTF8格式XML file(Writing UTF-8 files in C++)
- 使用hta保存utf8格式的文件的代码
- 62 ----这个文件夹保存的格式为utf8的,否则会出不来;----文件保存格式不对也出不来:
- 解决IDEA XML文件编辑后保存格式错误导致MalformedByteSequenceException: 3 字节的 UTF-8 序列的字节 3无效
- 让TinyXML保存文件为UTF-8格式
- 配置vim 默认保存文件格式为UTF-8
- 让TinyXML保存文件为UTF-8格式
- R语言保存文件 Error in save error writing to connection
- C++ 保存文件为UTF8编码格式
- 保存文件为utf8格式。
- C#保存文件为无BOM的utf8格式
- PHP文件保存出现的BOM头(utf-8)的解决方式——保存格式为ANSI即可
- 让TinyXML保存文件为UTF-8格式
- Qt5文件操作_保存成"UTF-8"格式
- python解析plist文件gb2312编码格式到utf-8编码格式
- 关于PHP 生成 UTF-8格式的文件
- 已知HICON,如何将其保存为图标文件?以及ICO文件的格式
- 文件格式从UTF8转换成ANSII格式
- Excel文件保存再打开,数字格式变为时间格式的解决办法
- 在delphi 2010里把memo1里的中文保存为utf8格式,下面的方法能成功不会出现乱码