Linux下C++国际化

原创 2012年03月24日 08:52:19

有关国际化

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

例如,“把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 <iostream>
#include <locale>
 
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 <iostream>
#include <locale>
 
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 <iostream>
#include <locale>
#include <cstdlib>
 
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却可以。原因未知。

C++之国际化(2) --- locale

转载自:http://hi.baidu.com/nicker2010/item/8cc13bce77f11b3899b498eb   解决国际化问题,通常是通过locale环境,它被用来封装国家(...
  • Templar1000
  • Templar1000
  • 2014年03月03日 13:30
  • 2222

彻底解密C++宽字符,C++国际化策略解析

“这个问题比你想象中复杂” (我也学下BS的风格,虽然这句话是我自己临时想说的。^^) 从字符到整数 char是一种整数类型,这句话的含义是,char所能表示的字符在C/C++中都是整数类型。好,...
  • jack0823
  • jack0823
  • 2014年01月04日 12:35
  • 1294

C++之国际化(3) --- facet

转载自:http://hi.baidu.com/nicker2010/item/73a7cef6be3596be30c199eb   国际化议题通常被划分为数个不同的模块,例如:数值、日期时间、货...
  • Templar1000
  • Templar1000
  • 2014年03月03日 13:31
  • 1313

彻底解密C++宽字符,C++国际化策略解析

“这个问题比你想象中复杂” (我也学下BS的风格,虽然这句话是我自己临时想说的。^^) 从字符到整数 char是一种整数类型,这句话的含义是,char所能表示的字符在C/C++中都是整数类型。好,...
  • jack0823
  • jack0823
  • 2014年01月04日 12:35
  • 1294

QT国际化(中英转换)

QT国际化(中英转换)我们都知道在安卓中,想做国际化很简单,只需要建立对应的资源文件,在对应的strings里面修改字符即可。但在QT中相对会比较麻烦,没安卓那么简单,不过也不是很复杂,最近在弄国际化...
  • u012528526
  • u012528526
  • 2017年01月24日 13:34
  • 863

软件本地化/国际化解决方案 - 多语种代码生成工具

提起程序信息本地化/国际化解决方案(本地化和国际化是指让软件支持多国语言的显示), 很多人首先可能会想到大名鼎鼎的GNU GetText, 的确这是一个很优秀的解决方案。另外,还有一种方式是操作程序的...
  • HTControl
  • HTControl
  • 2014年10月22日 21:09
  • 1314

国际化语言表

https://msdn.microsoft.com/zh-cn/selectlocale-dmc?fromPage=https%3a%2f%2fmsdn.microsoft.com%2fzh-cn%...
  • zhanglong_longlong
  • zhanglong_longlong
  • 2016年10月09日 11:09
  • 505

在JSP中实现国际化

工作中有个Java Web项目需要将英文版翻译出中文版,其中主要使用了大量的JSP页面进行显示,所以遇到JSP的国际化的问题,我今天做了一些调研,已经通过技术分析并形成方案,现总结如下: 对...
  • alanzyy
  • alanzyy
  • 2013年02月21日 17:59
  • 2011

Android studio 中如何实现国际化

最近在做一个闹钟的项目,因为闹钟是纯英文版的,有人就提议想让闹钟也有中文版的,这就涉及到了国际化的问题,下面就如何解决国际化问题给出方法。 step 1:下载AndroidLocalizatione...
  • qq_37679984
  • qq_37679984
  • 2017年03月06日 10:44
  • 454

菜鸟学SSH(二)——Struts2国际化手动切换版

localization,l10n)指让产品(出版物,软件,硬件等)能够适应非本地环境,特别是其他的语言和文化。程序在不修改内部代码的情况下,能根据不同语言及地区显示相应的界面。 国际化原理: 国...
  • liushuijinger
  • liushuijinger
  • 2013年11月20日 08:03
  • 10760
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux下C++国际化
举报原因:
原因补充:

(最多只允许输入30个字)