LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: gulfstream

wcout没法显示中文

[复制链接]
 楼主| 发表于 2005-12-31 15:26:14 | 显示全部楼层
你的locale设的什么?
回复 支持 反对

使用道具 举报

发表于 2005-12-31 17:17:12 | 显示全部楼层
zh_CN.GBK
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-12-31 17:52:25 | 显示全部楼层
wchar_t* ws = L"a测试b测试c";
里面的汉字不要从这里拷贝,需要你自己输入。这里的汉字是utf-8的,而你的系统是gbk编码


Post by jsean
zh_CN.GBK
回复 支持 反对

使用道具 举报

发表于 2005-12-31 18:15:28 | 显示全部楼层
原来就 是自己输入的,不是从这考过去的
回复 支持 反对

使用道具 举报

发表于 2006-1-1 18:25:43 | 显示全部楼层

  1. #include <iostream>

  2. int main()
  3. {
  4.         setlocale(LC_ALL, "zh_CN.UTF-8");
  5.         wchar_t* ws = L"a测试b测试c";
  6.         std::wcout << ws << std::endl;
  7.         int * p = (int *)ws;
  8.         while (*p)
  9.         {
  10.                 std::wcout << std::hex << *p++ << L'\n';
  11.         }
  12. }
复制代码

我用gcc 3.3.6测试只得到一个a
用gcc3.4.5测试就正常了。

这个程序里:X环境下的locale,这个程序设置的locale,"a测试b测试c"在源代码中的编码,输出时使用的编码;关系好像有点复杂,高手可不可以解释一下呢?
回复 支持 反对

使用道具 举报

发表于 2006-1-3 11:21:47 | 显示全部楼层
manphiz的代码是对的.
我对setlocale的认识不深, 惭愧. 根据man手册:
       On startup of the main program, the portable "C" locale is selected as
       default.  A program may be made portable to  all  locales  by  calling
       setlocale(LC_ALL,  ""  )  after  program  initialization, by using the
       values returned from a localeconv() call for locale - dependent infor-
       mation,  by using the multi-byte and wide character functions for text
       processing if MB_CUR_MAX > 1, and by  using  strcoll(),  wcscoll()  or
       strxfrm(), wcsxfrm() to compare strings.

默认的locale竟然是C,而不是当前的$LANG!!

所以最通用的方法看来也许是
#include <iostream>
int main()
{
                setlocale(LC_ALL, "");
                wchar_t* ws = L"a测试b测试c";
                std::wcout << ws << std::endl;
}

可知wcout肯定在输出到终端前用wcstombs之类的东西转换了字符串.

---------------------------------
呵呵,发之后才看到zhllg的贴子ANGUAGE, LC_ALL, LC_MESSAGES, LANG
....................
首先,这几个环境变量并不能自动控制库函数(比如gettext)所使用的locale。也就是说设置了这些环境变量,程序的界面语言可能没有变化,虽然这样的软件应该很少。所有的c语言程序默认的locale都是"C"。 setlocale可以改变库函数所用的locale。如果希望利用这些环境变量来设定库函数所使用的locale或者某个locale的 category,一定要用""作为setlocale的第二个参数来调用setlocale()。绝大多数软件都会这样做:
setlocale(LC_ALL, "");
如果不调用setlocale(),或者使用其他自己指定的合法locale字符串(比如“zh_CN.utf8")作为第二个参数调用setlocale,那么这些环境变量就一点用都没有。所以如果你正确设定了环境变量,但还是不起作用的话,不排除软件本身有问题。
....................
回复 支持 反对

使用道具 举报

发表于 2006-1-5 23:07:52 | 显示全部楼层
为什么我按上面的例子用g++编译时提示:
locale1.cpp: In function 'int main()':
locale1.cpp:8: error: converting to execution character set: 无效或不完整的多字 节字符或宽字符
是不是我的locale设置是zh_CN.GBK的缘故啊?
回复 支持 反对

使用道具 举报

发表于 2009-10-14 10:04:07 | 显示全部楼层

多年前的问题

应该把文件的编码改为utf-8就好了,如vim中:
:set fileencoding=utf-8
回复 支持 反对

使用道具 举报

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

本版积分规则

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