|
发表于 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,那么这些环境变量就一点用都没有。所以如果你正确设定了环境变量,但还是不起作用的话,不排除软件本身有问题。
.................... |
|