看了 宽字符的输出 一文,也想试用下stlport5.1 + mingw 的宽字符。

以前也试过,不过在mingw上好象并不支持wcout,libstd++不支持,stlport 较早版本也不支持。
现在stlport5.1终于让mingw有了宽字符了!

写个简单的代码:

#include <iostream> 


using namespace std; 


int main() 

{ 

    wcout.imbue(locale("")); 

    wcout << L"你好" << endl; 

     

    return 0; 

}



需要注意:

1.
源文件中有中文,我在vi中不能输入中文,所以是用Windows编辑工具写的。
这里有个编码问题,一般不指定就会自动保存为GB2312编码。
gcc将报错:converting to execution character set: Illegal byte sequence
因为gcc是按UTF-8编码读入源文件并输出可执行程序的。
使用 -finput-charset=GB2312 会产生一堆错误:
根源是:

In file included from .../stlport/stl/char_traits.h:43, 

                 from .../stlport/stl/_iosfwd.h:22, 

                 from .../stlport/iostream:38, 

                 from main.cpp:2: 

.../stlport/stl/_construct.h:46:39: failure to convert GB2312 to UTF-8



按理所包含的stlport头文件是纯ASCII,可以当GB2312处理,此处不明!
反正 -finput-charset=GB2312 不能解决问题。

将源文件保存为UTF-8就好了。我用notepad保存,再用UEdit去除头部3 个字节。

2.
必须显式指定local:
   wcout.imbue(locale(""));
或者更明确地
   wcout.imbue(locale("chs"));
不然输出中文只是个“?”,或者乱码。
可能程序缺省按UTF-8输出了,但是编译时设定 -fexec-charset=GB2312也没有用。