wprintf、wcout输出中文和unicode中文字符串的转换问题

本来想搞明白点wchar_t,就写了个很简单的wcout的例子,结果中文无法输出,然后换成wprintf,却还是不行~于是在网上搜啊搜,总算解决了问题,总结一下:

    wchar_t *ws = L"你好";
    wcout << ws << endl;

这样没有任何输出,必须将locale设为本地语言,就是在wcout前加入下面这句话就可以:

    std::wcout.imbue( locale(locale(), "", LC_CTYPE) );
//注:如果无效,可以试试把 LC_CTYPE 改成 LC_ALL

    也可以指定中文语言:
    std::wcout.imbue( locale(locale(), "chs", LC_CTYPE) );  

很多资料用这句话wcout.imbue(locale("")),这样会改变wcout的所有locale设置,比如int型的1234会显示成1.234

可是wprintf还是不可用,必须在使用前把C语言的locale设置成本地语言:
  
    setlocale( LC_CTYPE, "" );//或者"chs"

但这个设置是全局的,后果就是会让cout和wcout无法再输出中文,所以我们在用完后必须设置回原来的:

    setlocale( LC_CTYPE, "" );  
    wprintf( L"%s", L"你好" );
    setlocale( LC_CTYPE, "C" );

一般情况下"C"就是原来的,但也可能不是,这时候我们可以将老的locale保存,用完后还原:

    char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); 
    setlocale( LC_CTYPE, "" );
    wprintf( L"%s", L"你好" );
    setlocale( LC_CTYPE,  old_locale );

wofstream本没有想用,不过既然查到了就一并记下来:

在缺省的locale下,ofstream能正确输出中文到文件中,但不支持中文文件名,wofstream支持中文文件名,但不能向文件中输出中文。要解决这个问题,需要在打开文件之前将全局locale设为本地语言。将全局locale设为本地语言后,ofstream和wofstream的问题都解决了,但 cout和wcout却不能输出中文了,所以还是要将全局locale恢复原来的设置:

    locale &loc=locale::global(locale(locale(),"",LC_CTYPE));
   ofstream ofs("你好.txt");
   wofstream wofs(L"你好.txt");
   locale::global(loc);
  ofs<<"test测试"<<1234<<endl;
   wofs<<L"Another test还是测试"<<1234<<endl;

wchar_t*与char*的转换函数wcstombs和mbstowcs也需要类似设置才有效,下面是一个例子:
    
     wchar_t *ws = L"你好吗";
     char cs[10];
     wchar_t ws2[10];
     unsigned int len = 2 * ( wcslen(ws) + 1 );

     char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );  
     setlocale( LC_CTYPE, "" );
     wcstombs( cs, ws,len );
     mbstowcs( ws2, cs, len );
     setlocale( LC_CTYPE, old_locale );

     cout << cs << endl;

     std::wcout.imbue( locale(locale(), "", LC_CTYPE) );
     wcout << ws2 << endl;

本文参考文章:http://blog.csdn.net/wzcprince/archive/2009/07/11/4340699.aspx


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章