linux wcout 输出中文,解决为什么wcout不能输出中文问题

转自http://www.cnblogs.com/moonz-wu/archive/2008/12/30/1365552.html

wprintf 和 wcout

这篇文章应该是[netsin]的成果,我勤快,记下来。

注:wprintf是C的标准库函数,但wcout不是C++的标准成员,C++中的 L"……" 是宽字符,却未必是unicode字符,这与编译器实现相关。

[乾坤一笑]说:为什么 C/C++ 语言把 L"xx" 定义为由实现决定的呢?这显然是为了 C/C++ 的普适性、可移植性。Bjarne 的观点认为,C++ 的方式是允许程序员使用任何字符集作为串的字符类型。另外,unicode 编码已经发展了若干版本了,是否能永久适合下去也不得而知。有关 unicode 的详细论述以及和其它字符集的比较,我推荐你看《无废话xml》。

以下两段代码的执行环境是 windows xp professional 英文版,编译器是 VS2005RTM。

// C

#include

#include

int main( void )

{

setlocale( LC_ALL, "chs" );

//setlocale( LC_ALL, "Chinese-simplified" );

//setlocale( LC_ALL, "ZHI" );

//setlocale( LC_ALL, ".936" );

wprintf( L"中国" );

return 0;

}

// C++

#include

#include

using namespace std;

int main( void )

{

locale loc( "chs" );

//locale loc( "Chinese-simplified" );

//locale loc( "ZHI" );

//locale loc( ".936" );

wcout.imbue( loc );

std::wcout << L"中国" << endl;

return 0;

}

说明:别混合使用 setlocale 和 std::locale 。

------------------------- 2006-07-05 记 -------------------------

"VC知识库" 编码为:56 43 D6 AA CA B6 BF E2 00 // ANSI编码

L"VC知识库" 在VC++ 中编码为:56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)编码

L"VC知识库" 在GCC(Dev-CPP4990) 中编码为:56 00 43 00 D6 00 AA 00 CA 00 B6 00 BF 00 E2 00 00 00 // 只是将ANSI编码简单的加0

L"VC知识库" 在GCC(Dev-CPP4992) 中编译失败,报 Illegal byte sequence

L"VC知识库" 在 Dev-CPP4992 中解决步骤为:

a. 将文件保存为 utf-8 编码 // utf-8 是unicode的其中一种,但和(windows口中的unicode)不一样

b. 去掉BOM头:用二进制编辑器(比如VC)去掉刚才utf-8文件的前三个字节 // Linux/UNIX并不使用BOM

c. 使用 gcc/g++ 编译运行

经过以上解决步骤,在 dev-cpp4992 中

"VC知识库" 编码为: 56 43 E7 9F A5 E8 AF 86 E5 BA 93 00 // utf-8编码,注意不再是ANSI编码了,因此用 printf/cout 将输出乱码

L"VC知识库" 编码为: 56 00 43 00 E5 77 C6 8B 93 5E 00 00 // (windows口中的unicode)编码

补充:在mingw32中使用wcout和wstring需要加一些宏,比如

#define _GLIBCXX_USE_WCHAR_T 1

#include

int main( void )

{

std::wcout << 1 << std::endl;

}

可以编译通过,但无法Link通过,在网上google了一下,stlport说mingw32有问题,mingw32说是M$的c runtime有问题。

------------------------- 2007-01-05 记 -------------------------

一个多字节字符串和宽字符字符串互相转化的事例

#define _CRT_SECURE_NO_WARNINGS // only for vc8

#include

#include

#include

inline const std::string to_mbcs( const std::string& src )

{

return src;

}

const std::string to_mbcs( const std::wstring& src )

{

char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原来的locale

setlocale( LC_CTYPE, "chs" ); // 设置当前locale为chs,这在非简体中文平台上不可缺少

size_t count1 = wcstombs( NULL, src.c_str(), 0 ); // 计算新字符串长度

std::string des( count1, ' ' );

size_t count2 = wcstombs( &des[0], src.c_str(), count1 ); // 转化

assert( count1 == count2 );

setlocale( LC_CTYPE, old_locale ); // 恢复到原来的locale

free( old_locale );

return des;

}

inline const std::wstring to_wcs( const std::wstring& src )

{

return src;

}

const std::wstring to_wcs( const std::string& src )

{

char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); // 保存原来的locale

setlocale( LC_CTYPE, "chs" ); // 设置当前locale为chs,这在非简体中文平台上不可缺少

size_t count1 = mbstowcs( NULL, src.c_str(), 0 ); // 计算新字符串长度

std::wstring des( count1, L' ' );

size_t count2 = mbstowcs( &des[0], src.c_str(), count1 ); // 转化

assert( count1 == count2 );

setlocale( LC_CTYPE, old_locale ); // 恢复到原来的locale

free( old_locale );

return des;

}

#include

int main( void )

{

using namespace std;

cout << to_mbcs("你好1") << endl;

cout << to_mbcs(L"你好2") << endl;

const locale loc( "chs" );

wcout.imbue( loc );

wcout << to_wcs("你好3") << endl;

wcout << to_wcs(L"你好4") << endl;

}

------------------------- 2008-09-03 记 -------------------------

参见 《MBCS To Unicode 》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值