力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks
扔掉MultiByteToWideChar 吧,使用std::wstring_convert和 std::codecvt_utf8 来处理UTF8与WChar之间的互转。
VC和Clang都支持哦~

#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
#include <fstream>

int main(int argc, char *argv[])
{
   std::wstring str = L"123,我是谁?我爱钓鱼岛!";

   std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;

   std::string narrowStr = conv.to_bytes(str);
   {
      std::ofstream ofs ("c:\\test.txt");
      ofs << narrowStr;
   }

   std::wstring wideStr = conv.from_bytes(narrowStr);
   {
      std::locale::global(std::locale("Chinese-simplified"));
      std::wofstream ofs (L"c:\\testW.txt");
      ofs << wideStr;
   }
posted on 2012-09-11 17:59 力为 阅读(18593) 评论(9)  编辑 收藏 引用 所属分类: 4. C++ FAQ

评论

# re: std::wstring_convert处理UTF8 2012-09-11 21:40 万连文
请问这是资本主义的东西还是社会主义的东西,还是可以拿来主义的东西?  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2012-09-11 23:52 P
以前竟然不知道有这个好东西的存在。。  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2012-09-12 09:07 right
很多时候,头疼的是代码页到UTF8等等的转换,特别是一些遗留的老代码和老的文件格式  回复  更多评论
  

# re: std::wstring_convert处理UTF8[未登录] 2012-09-12 10:49 ccc
编译不通过,找不到codecvt这个文件。  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2012-09-12 12:33 wjh2005
查到了这个:codecvt_utf8 (C++11)
这个应该是C++11标准提供的功能。


#include <iostream>
#include <string>
#include <locale>
#include <codecvt>
int main()
{
// UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS2
std::string utf8 = u8"z\u6c34\U0001d10b";

// the UTF-8 / UTF-16 standard conversion facet
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
std::u16string utf16 = utf16conv.from_bytes(utf8);
std::cout << "UTF16 conversion produced " << utf16.size() << " code points:\n";
for(char16_t c : utf16)
std::cout << std::hex << std::showbase << c << '\n';

// the UTF-8 / UCS2 standard conversion facet
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;
try {
std::u16string ucs2 = ucs2conv.from_bytes(utf8);
} catch(const std::range_error& e) {
std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted()));
std::cout << "UCS2 failed after producing " << std::dec << ucs2.size()<<" characters:\n";
for(char16_t c : ucs2)
std::cout << std::hex << std::showbase << c << '\n';
}
}  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2012-09-12 14:18 力为
@ccc 需要VS2010 SP1
  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2012-09-14 01:00 fzy
good  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2013-08-02 18:11 永遇乐
很好!学习了,以后用vs2012时再使用。  回复  更多评论
  

# re: std::wstring_convert处理UTF8 2014-02-18 16:16 qicosmos
转换宽字符的代码输出乱码不知道啥原因  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理