linux wcout 输出中文,Linux下C++国际化

有关国际化

应用程序国际化的实质是提供一种机制,使其能根据环境变量或配置文件,来指导程序的行为。当对新的“国家”进行支持时,不用修改代码,只修改资源文件就可以实现。

例如,“把LANG设为C,再用vi打开带中文的文件,中文显示乱码”。就是因为vi根据LANG做了某些操作。

在Linux下,和国际化相关的locale环境变量有三类:LC_ALL,LC_*(如LC_CTYPE等),LANG。

根据man 7 locale里的定义,这三者的优先级为LC_ALL>LC_*>LANG,即LC_ALL定义的内容会覆盖LC_*和LANG的,LC_*会覆盖LANG的。

locale变量的格式为(参照网上的资料):

语言[_地域][.字符集] [@修正值]

例如:

1、我说中文,身处中华人民共和国,使用国标2312字符集来表达字符。zh_CN.GB2312=中文_中华人民共和国+国标2312字符集。

2、我说中文,身处中华人民共和国,使用国标18030字符集来表达字符。zh_CN.GB18030=中文_中华人民共和国+国标18030字符集。

3、我说中文,身处中华人民共和国台湾省,使用国标Big5字符集来表达字符。zh_TW.BIG5=中文_台湾.大五码字符集 。

4、我说英文,身处大不列颠,使用ISO-8859-1字符集来表达字符。 en_GB.ISO-8859-1=英文_大不列颠.ISO-8859-1字符集 。

5、我说德语,身处德国,使用UTF-8字符集,习惯了欧洲风格。de_DE.UTF-8@euro=德语_德国.UTF-8字符集@按照欧洲习惯加以修正。

可以使用命令locale来查看用户当前的locale配置:

LANG=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=

应用程序也可以定义自己的环境变量或配置文件,来处理国际化问题。例如oracle的NLS_LANGUAGE。

C++中的国际化

C++使用locale类来处理国际化问题。

例如

1)  使用德文格式输出数字:

//de_num.cpp

#include

#include

using namespace std;

int main()

{

int a =1234567;

cout<< a << endl;

localel("de_DE.UTF-8");

cout.imbue(l);

cout<< a << endl;

return 0;

}

结果:

1234567

1.234.567

即德文格式用.来作为每三个数字的间隔。

2)得到用户环境变量的信息:

//get_user_locale.cpp

#include

#include

using namespace std;

int main()

{

//createthe default locale from the user's environment

localel("");

cout<< l.name() << endl;

return 0;

}

结果

en_US.UTF-8

3)cout.imbue(locale(""));和不设imbue是不一样的

cout.imbue(locale(""));//按照用户的环境变量来创建locale并设置cout

不设相当于cout.imbue(locale("C"));

locale的详细使用方法可以参照《The C++Standard Library》第14章。

char和wchar_t

char是C++中的多字节表示。linux下的char是UTF-8格式的,是变长的。

wchar_t是C++中的宽字节表示。linux下的wchar_t是UTF-32格式的,是定长的,占4字节。

多字节一般用在程序的外部储存数据,可以节省空间。宽字节一般用在程序的内部储存数据(内存中),便于程序处理。

在linux下似乎不鼓励使用wchar_t,有莫名其妙的问题。

例如如下代码:

//wcout.cpp

#include

#include

#include

using namespace std;

int main()

{

locale::global(locale("zh_CN.UTF-8")); //OK

//wcout.imbue(locale("zh_CN.UTF-8")); //Not OK

constwchar_t * b = L"中文";

wcout<< b << endl;

return 0;

}

按照书上的要求设置wcout.imbue,却不能正确输出。但是设置locale::global却可以。原因未知。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值