LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2896|回复: 27

wcout没法显示中文

[复制链接]
发表于 2005-12-28 15:09:05 | 显示全部楼层 |阅读模式
试图用wcout显示输出中文,但中文始终不能显示,英文倒是可以,不知何故?

代码形如:

setlocale(LC_ALL, "zh_CN.UTF8");
wchar_t * w = L"a测试b测试c";
std::wcout<<w<<std::endl;

运行输出结果为:
abc

其中的中文全都不见了,何故?:ask :ask

使用的gcc 4.0.3
发表于 2005-12-28 15:42:34 | 显示全部楼层
需要用mbsrtowcs函数先把"a测试b测试c"转成wchar_t类型,单纯一个L前缀一点用都没有的。
还要注意,必须是X环境下的终端。Console方式同样也显示不正确。
并且:Linux下是不能使用wcin和wcout的,同样也不能使用wprintf。具体原因我也不清楚。
如果单单是想正确显示那么直接声明成char*,然后cout就可以了,前提呢,运行该程序的Locale或Language必须设置为你输入那串中文所对应的地区和汉字编码。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-28 16:55:53 | 显示全部楼层
L"a测试b测试c"是有效的,wchar_t * w = L"a测试b测试c"经过wcstombs转换成char *后可以正常显示“a测试b测试c”。只是奇怪wcout为什么对显示中文无效
回复 支持 反对

使用道具 举报

发表于 2005-12-28 17:23:23 | 显示全部楼层
Post by gulfstream
L"a测试b测试c"是有效的,wchar_t * w = L"a测试b测试c"经过wcstombs转换成char *后可以正常显示“a测试b测试c”。只是奇怪wcout为什么对显示中文无效

L前缀根本就是没有用的。
你用gdb看一下你
wchar_t * w = L"a测试b测试c";
后的w空间就明白了。
牵涉到的具体gdb命令是
p w[0]
p w[1]
p w[2]
...
回复 支持 反对

使用道具 举报

发表于 2005-12-29 00:29:24 | 显示全部楼层
  1. $ cat test.cc
  2. #include <iostream>

  3. int main()
  4. {
  5.         setlocale(LC_ALL, "zh_CN.UTF-8");
  6.         wchar_t* ws = L"a测试b测试c";
  7.         std::wcout << ws << std::endl;
  8. }

  9. $ g++ test.cc -o test
  10. $ ./test
  11. a测试b测试c
复制代码

这不是正常输出了吗?不明白你们在搞什么……
我是Debian sid gcc 4.0.3 prerelease
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-29 09:20:42 | 显示全部楼层
新发现现象,
int main()
{
        setlocale(LC_ALL, "zh_CN.UTF-8");
        wchar_t* ws = L"a测试b测试c";
        std::wcout << ws << std::endl;
}
可以正常显示,但是
int main()
{
        setlocale(LC_ALL, "zh_CN.UTF-8");
        wchar_t* ws = L"a测试b测试c";
        std::wcout << ws << std::endl;

        char * c = "c测试b测试a";
        std::cout<<c<<std::endl;
}
只能输出:
a测试b测试c

如果:
int main()
{
        char * c = "c测试b测试a";
        std::cout<<c<<std::endl;

        setlocale(LC_ALL, "zh_CN.UTF-8");
        wchar_t* ws = L"a测试b测试c";
        std::wcout << ws << std::endl;
}
则输出:
c测试b测试a
aK bK c


Post by manphiz
  1. $ cat test.cc
  2. #include <iostream>

  3. int main()
  4. {
  5.         setlocale(LC_ALL, "zh_CN.UTF-8");
  6.         wchar_t* ws = L"a测试b测试c";
  7.         std::wcout << ws << std::endl;
  8. }

  9. $ g++ test.cc -o test
  10. $ ./test
  11. a测试b测试c
复制代码

这不是正常输出了吗?不明白你们在搞什么……
我是Debian sid gcc 4.0.3 prerelease
回复 支持 反对

使用道具 举报

发表于 2005-12-29 09:43:06 | 显示全部楼层
他的GCC版本比较新吧,我的是3.3.5
回复 支持 反对

使用道具 举报

发表于 2005-12-29 09:53:24 | 显示全部楼层
后来我又用icc试了一下编译,用gdb看了w[0]...w[7]。发现L前缀也是没有用的。
照理论上的分析,楼主的程序光用L前缀是不行的,必须用mbsrtowcs先转换,然后才能用wcout输出。
但我以前看到的一些参考说因为标准C++对国际化支持的不好,所以wcout和wcin并没有实现。
不知道现在的情况是否有了改善了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-29 10:16:07 | 显示全部楼层
我直接输出w[0]...w[7]的值,分别是:
w[0]=0x61
w[1]=0x6d4b
w[2]=0x8bd5
w[3]=0x62
......
就是“a测试b测试c”的unicode编码,L前缀应该是有用的


Post by realtang
后来我又用icc试了一下编译,用gdb看了w[0]...w[7]。发现L前缀也是没有用的。
照理论上的分析,楼主的程序光用L前缀是不行的,必须用mbsrtowcs先转换,然后才能用wcout输出。
但我以前看到的一些参考说因为标准C++对国际化支持的不好,所以wcout和wcin并没有实现。
不知道现在的情况是否有了改善了。
回复 支持 反对

使用道具 举报

发表于 2005-12-29 10:38:23 | 显示全部楼层
Post by gulfstream
我直接输出w[0]...w[7]的值,分别是:
w[0]=0x61
w[1]=0x6d4b
w[2]=0x8bd5
w[3]=0x62
......
就是“a测试b测试c”的unicode编码,L前缀应该是有用的

跟我的结果不一样嘛,你用什么版本的GCC。我的是3.3.5,ICC是9.0的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表