Linux C编程17-locale

目录

1、简介

2、locale格式

3、locale分类

4、Local设定的优先级

5、LC_ALL=C的含义

6、locale定义文件

7、自定义locale

8、查看locale相关信息

8.1、查看当前的locale设置

8.2、查看当前可用的locale

8.3、查看当前可用的locale更详细的信息

8.4、查看当前可用的charmaps

9、设置区域语言

9.1、localectl命令

9.2、export命令

10、struct lconv结构体

11、localeconv()函数

12、setlocale()函数

13、locale 名称及其说明


1、简介

Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。

2、locale格式

[language][area][.charset][@modifier]

language 表示语言,例如英语或中文;area 表示使用该语言的地区,例如美国或者中国大陆;charset 表示字符集编码,例如 UTF-8 或者 GBK。modifier是修正符,有些地方会用到,例如:de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯,这是两套不同的标准。还有两个比较特殊的值是CPOSIX分别代表C标准和POSIX标准,这两种标准对于数据的显示方式、排序方式等都有各自的规定。

注:charset 可以省略,此时会选择当前语言的默认charset(Linux 发行版大都使用 UTF-8 编码);

3、locale分类

1LC_CTYPE语言符号及其分类
2LC_NUMERIC数字
3LC_COLLATE比较和排序习惯
4LC_TIME时间显示格式
5LC_MONETARY货币单位
6LC_MESSAGES信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等
7LC_NAME姓名书写方式
8LC_ADDRESS地址书写方式
9LC_TELEPHONE电话号码书写方式
10LC_MEASUREMENT度量衡表达方式
11LC_PAPER默认纸张尺寸大小
12LC_IDENTIFICATION对locale自身包含信息的概述
13LC_ALL

设置所有的LC_*的变量

14LANG缺省值,为所有未设置的区域设置变量指定默认区域设置。
15LANGUAGE大多数程序将此作为其界面语言。

注:LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用默认locale(C locale或POSIX locale)。

4、Local设定的优先级

优先级描述
1LANGUAGE 优先级最高 ,指定个人对语言环境值的主次偏好,例如zh_CN:en_US:en,冒号分隔的是多种选择。
2LC_ALL 设置的值
3LC_* 可设定locale各方面(category)的值,可以覆盖LANG的值。
4LANG 指定默认使用的locale值
LANGUAGE > LC_ALL > LC_* >LANG

5、LC_ALL=C的含义

"C"是系统默认的locale,"POSIX"是"C"的别名。当新安装完一个系统时,默认的locale就是C或POSIX。设置LC_ALL=C,实际上是调用了setlocale把所有的LC_*的变量设置了一遍。目的是去除所有本地化的设置,让命令能正确执行(解决各种与区域设置有关的warning。从程序运行角度看,就是保持程序输出的统一格式,这样有些程序才能正确执行下去)。

注:"C"是一种非常中立的地域设置,不偏向于任何一个地区,它会尽量少地包含地域设置信息,这些信息只是让C语言程序能够正常运行。大多数情况下,"C"仅仅是对小数点进行了设置(设置为.),其它的信息都被置空。

6、locale定义文件

/usr/share/i18n/locales目录下

7、自定义locale

/usr/lib/locale/目录下

8、查看locale相关信息

8.1、查看当前的locale设置

locale

8.2、查看当前可用的locale

locale -a

8.3、查看当前可用的locale更详细的信息

locale -av

8.4、查看当前可用的charmaps

locale -m

9、设置区域语言

9.1、localectl命令

localectl set-locale  LANG=zh_CN.utf8

9.2、export命令

export  LANG=zh_CN.utf8

10、struct lconv结构体

typedef struct {
   char *decimal_point;
   char *thousands_sep;
   char *grouping;    
   char *int_curr_symbol;
   char *currency_symbol;
   char *mon_decimal_point;
   char *mon_thousands_sep;
   char *mon_grouping;
   char *positive_sign;
   char *negative_sign;
   char int_frac_digits;
   char frac_digits;
   char p_cs_precedes;
   char p_sep_by_space;
   char n_cs_precedes;
   char n_sep_by_space;
   char p_sign_posn;
   char n_sign_posn;
} lconv
序号成员描述
1decimal_point

用于非货币值的小数点字符。

注:通常认为小数点就是点号;但在法语、南非语、丹麦语、德语、希腊语、部分西班牙语中,小数点是逗号。

2thousands_sep

用于非货币值的千位分隔符。

注:在数字中,每隔三位数加入一个分隔符,以便更加容易认出数值。

3grouping 

一个表示非货币量中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 0 意味着前一个值将应用于剩余的分组。

千位分隔符 thousands_sep 分隔非货币数字时,每一个分组包含的数字个数。

grouping 成员就用来指定每隔几位加入一个千位分隔符。

grouping 包含一组以\为前导符的数字,每一个数字表示插入千位分隔符的位数,例如:

grouping 被设置为"\3",那么数字的分隔效果为 12,172,390,000;

grouping 被设置为"\1\2\3",那么数字的分隔效果为 12,172,390,00,0; grouping 被设置为"\3\1",那么数字的分隔效果为 1,2,1,7,2,3,9,0,000; grouping 被设置为"\1\3",那么数字的分隔效果为 1,217,239,000,0。 

4int_curr_symbol

国际货币符号使用的字符串。前三个字符是由 ISO 4217:1987标准指定(例如,美元的国际符号是"USD",欧元的国际符号是"GBP",人民币的国际符是"CNY"),第四个字符(空格)用于分隔货币符号和货币量。

5currency_symbol

本地货币符号(美元的货币符号为$,欧元的货币符号为,人民币的货币符号为)。

6mon_decimal_point用于货币值的小数点字符。
7mon_thousands_sep用于货币值的千位分隔符。
8mon_grouping和grouping类似,不过 grouping 针对的是当地货币格式,而 mon_grouping针对的是国际货币格式。
9positive_sign用于正货币值的字符(一般为空字符串)。
10negative_sign用于负货币值的字符(一般为负号)。
11int_frac_digits国际货币值中小数点后要显示的位数。
12frac_digits货币值中小数点后要显示的位数。
13p_cs_precedes

如果等于 1,则 currency_symbol 出现在正货币值之前。

如果等于 0,则 currency_symbol 出现在正货币值之后。

14p_sep_by_space

如果等于 1,则 currency_symbol 和正货币值之间使用空格分隔。

如果等于 0,则 currency_symbol 和正货币值之间不使用空格分隔。

15n_cs_precedes

如果等于 1,则 currency_symbol 出现在负货币值之前。

如果等于 0,则 currency_symbol 出现在负货币值之后。

16n_sep_by_space

如果等于 1,则 currency_symbol 和负货币值之间使用空格分隔。

如果等于 0,则 currency_symbol 和负货币值之间不使用空格分隔。

17p_sign_posn

表示正货币值中正号的位置。

0:positive_sign位于货币符号 currency_symbol 和数字放在括号中。

1:positive_sign位于货币符号 currency_symbol 和数字之前。

2:positive_sign位于货币符号 currency_symbol 和数字之后。

3:positive_sign紧挨着放在货币符号 currency_symbol 之前。

4:positive_sign紧挨着放在货币符号 currency_symbol 之后。

18n_sign_posn

表示负货币值中负号的位置。

0:negative_sign 位于货币符号 currency_symbol 和数字放在括号中。

1:negative_sign 位于货币符号 currency_symbol 和数字之前。

2:negative_sign 位于货币符号 currency_symbol 和数字之后。

3:negative_sign 紧挨着放在货币符号 currency_symbol 之前。

4:negative_sign 紧挨着放在货币符号 currency_symbol 之后。

19int_p_cs_precedes和 p_cs_precedes 类似。不过 p_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_p_cs_precedes 针对的是国际货币格式。
20int_n_cs_precedes和 n_cs_precedes 类似。不过 n_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_n_cs_precedes 针对的是国际货币格式。
21int_p_sep_by_space和 p_sep_by_space 类似。不过 p_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_p_sep_by_space 针对的是国际货币格式。
22int_n_sep_by_space和 n_sep_by_space 类似。不过 n_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_n_sep_by_space 针对的是国际货币格式。
23int_p_sign_posn和 p_sign_posn 类似。不过 p_sign_posn 针对的是当地(当前区域设置)的货币格式,而 int_p_sign_posn 针对的是国际货币格式。
24int_n_sign_posn和 n_sign_posn 类似。不过 n_sign_posn 针对的是当地(当前区域设置)的货币格式,而 int_n_sign_posn 针对的是国际货币格式。

注:序号19-24是 C99 标准新加入的,是否存在需看编译器是否支持。

11、localeconv()函数

用来返回区域设置(地域设置、本地设置)中与数字和货币有关的信息。

#include <locale.h>

struct lconv *localeconv(void);

返回值:struct lconv结构体指针。

12、setlocale()函数

进行区域设置(本地设置、地域设置)时,可以通过 locale 参数指明具体的地域设置名称。

#include <locale.h>

char *setlocale(int category, const char *locale);

参数 category:

1LC_ALL设置下面的所有选项。
2LC_COLLATE

影响字符比较(字符排序)具体来说就是影响 <string.h> 头文件中的 strcoll() 和 strxfrm() 函数。


在默认的地域设置中(设置为"C"),比较字符大小其实比较的是字符的内码,C语言一般使用 ASCII 编码,此时比较的就是字符的 ASCII 码值;但是在其它的地域设置中,可能会有不同的比较方式,例如在中文环境下就可以按照拼音来对字符进行比较和排序。

3LC_CTYPE

语言符号及其分类.语言符号及其分类。影响所有字符函数。例如 strtoupper()。

注:LC_CTYPE 的影响范围最大,可以说是地域设置中最重要的一项内容。

4LC_MONETARY

影响 localeconv 函数提供的货币信息针对 localeconv()。

例如,美元的货币符号是$,国际代码是USD;人民币的货币符号是,国际代码是CNY;英镑的货币符号是£,国际代码是GBP

5LC_NUMERIC

影响数字格式,包括小数点(用哪个字符来表示小数点)、数字分组等针对 localeconv()。

世界上大部分地区都使用.表示小数点,例如 12.45、0.88 等;但是在法语地区却使用,表示小数点,此时printf("%f", 12.45);的输出结果就是12,450000。

6LC_TIME影响日期时间的格式,具体来说就是影响 strftime() 函数的行为。

例如,美国地区书写日期的格式是月/日/年,比如08/31/2017;而大陆地区书写日期的格式是年/月/日,比如2017/08/31

参数 locale:地域设置的名称(字符串)。对于不同的平台和不同的编译器,地域设置的名称可能会不同。C语言标准规定至少要支持以下三个名称:

地域设置名称说明
"C"默认的地域设置.

"C"是一种非常中立的地域设置,不偏向于任何一个地区,它会尽量少地包含地域设置信息,这些信息只是让C语言程序能够正常运行。大多数情况下,"C"仅仅是对小数点进行了设置(设置为.),其它的信息都被置空。
""使用当前操作系统默认的地域设置。如果操作系统是英文版的,那就使用英文环境,如果操作系统是中文版的,那就使用中文环境,这样做提高了C程序的兼容性,可以根据操作系统的版本自动地选择语言。
NULL不指定任何名称。此时 setlocale() 不会对地域设置进行任何修改,仅仅是返回当前地域设置的名称。

返回值:

1)如果 setlocale() 执行成功,那么返回一个指向字符串的指针,该字符串包含了当前地域设置的名称。

2)如果 setlocale() 执行失败(例如为 locale 指定的名称不存在,就会导致地域设置失败),那么返回空指针 NULL。

13、locale 名称及其说明

区域性/语言名称区域性标识符区域性
""(空字符串)0x007F固定区域性
af0x0036南非荷兰语
af_ZA0x0436南非荷兰语(南非)
sq0x001C阿尔巴尼亚语
sq_AL0x041C阿尔巴尼亚语(阿尔巴尼亚)
ar0x0001阿拉伯语
ar_DZ0x1401阿拉伯语(阿尔及利亚)
ar_BH0x3C01阿拉伯语(巴林)
ar_EG0x0C01阿拉伯语(埃及)
ar_IQ0x0801阿拉伯语(伊拉克)
ar_JO0x2C01阿拉伯语(约旦)
ar_KW0x3401阿拉伯语(科威特)
ar_LB0x3001阿拉伯语(黎巴嫩)
ar_LY0x1001阿拉伯语(利比亚)
ar_MA0x1801阿拉伯语(摩洛哥)
ar_OM0x2001阿拉伯语(阿曼)
ar_QA0x4001阿拉伯语(卡塔尔)
ar_SA0x0401阿拉伯语(沙特阿拉伯)
ar_SY0x2801阿拉伯语(叙利亚)
ar_TN0x1C01阿拉伯语(突尼斯)
ar_AE0x3801阿拉伯语(阿联酋)
ar_YE0x2401阿拉伯语(也门)
hy0x002B亚美尼亚语
hy_AM0x042B亚美尼亚语(亚美尼亚)
az0x002C阿泽里语
az_Cyrl_AZ0x082C阿泽里语(阿塞拜疆,西里尔语)
az_Latn_AZ0x042C阿泽里语(阿塞拜疆,拉丁语)
eu0x002D巴斯克语
eu_ES0x042D巴斯克语(巴斯克地区)
be0x0023白俄罗斯语
be_BY0x0423白俄罗斯语(白俄罗斯)
bg0x0002保加利亚语
bg_BG0x0402保加利亚语(保加利亚)
ca0x0003加泰罗尼亚语
ca_ES0x0403加泰罗尼亚语(加泰罗尼亚地区)
zh_HK0x0C04中文(香港特别行政区,中国)
zh_MO0x1404中文(澳门特别行政区)
zh_CN0x0804中文(中国)
zh_Hans0x0004中文(简体)
zh_SG0x1004中文(新加坡)
zh_TW0x0404中文(台湾)
zh_Hant0x7C04中文(繁体)
hr0x001A克罗地亚语
hr_HR0x041A克罗地亚语(克罗地亚)
cs0x0005捷克语
cs_CZ0x0405捷克语(捷克共和国)
da0x0006丹麦语
da_DK0x0406丹麦语(丹麦)
dv0x0065迪维希语
dv_MV0x0465迪维希语(马尔代夫)
nl0x0013荷兰语
nl_BE0x0813荷兰语(比利时)
nl_NL0x0413荷兰语(荷兰)
en0x0009英语
en_AU0x0C09英语(澳大利亚)
en_BZ0x2809英语(伯利兹)
en_CA0x1009英语(加拿大)
en_0290x2409英语(加勒比)
en_IE0x1809英语(爱尔兰)
en_JM0x2009英语(牙买加)
en_NZ0x1409英语(新西兰)
en_PH0x3409英语(菲律宾)
en_ZA0x1C09英语(南非)
en_TT0x2C09英语(特立尼达和多巴哥)
en_GB0x0809英语(英国)
en_US0x0409英语(美国)
en_ZW0x3009英语(津巴布韦)
et0x0025爱沙尼亚语
et_EE0x0425爱沙尼亚语(爱沙尼亚)
fo0x0038法罗语
fo_FO0x0438法罗语(法罗群岛)
fa0x0029波斯语
fa_IR0x0429波斯语(伊朗)
fi0x000B芬兰语
fi_FI0x040B芬兰语(芬兰)
fr0x000C法语
fr_BE0x080C法语(比利时)
fr_CA0x0C0C法语(加拿大)
fr_FR0x040C法语(法国)
fr_LU0x140C法语(卢森堡)
fr_MC0x180C法语(摩纳哥)
fr_CH0x100C法语(瑞士)
gl0x0056加利西亚语
gl_ES0x0456加利西亚语(西班牙)
ka0x0037格鲁吉亚语
ka_GE0x0437格鲁吉亚语(格鲁吉亚)
de0x0007德语
de_AT0x0C07德语(奥地利)
de_DE0x0407德语(德国)
de_LI0x1407德语(列支敦士登)
de_LU0x1007德语(卢森堡)
de_CH0x0807德语(瑞士)
el0x0008希腊语
el_GR0x0408希腊语(希腊)
gu0x0047古吉拉特语
gu_IN0x0447古吉拉特语(印度)
he0x000D希伯来语
he_IL0x040D希伯来语(以色列)
hi0x0039印地语
hi_IN0x0439印地语(印度)
hu0x000E匈牙利语
hu_HU0x040E匈牙利语(匈牙利)
is0x000F冰岛语
is_IS0x040F冰岛语(冰岛)
id0x0021印度尼西亚语
id_ID0x0421印度尼西亚语(印度尼西亚)
it0x0010意大利语
it_IT0x0410意大利语(意大利)
it_CH0x0810意大利语(瑞士)
ja0x0011日语
ja_JP0x0411日语(日本)
kn0x004B卡纳达语
kn_IN0x044B卡纳达语(印度)
kk0x003F哈萨克语
kk_KZ0x043F哈萨克语(哈萨克斯坦)
kok0x0057贡根语
kok_IN0x0457贡根语(印度)
ko0x0012朝鲜语
ko_KR0x0412朝鲜语(韩国)
ky0x0040吉尔吉斯语
ky_KG0x0440吉尔吉斯语(吉尔吉斯坦)
lv0x0026拉脱维亚语
lv_LV0x0426拉脱维亚语(拉脱维亚)
lt0x0027立陶宛语
lt_LT0x0427立陶宛语(立陶宛)
mk0x002F马其顿语
mk_MK0x042F马其顿语(马其顿,FYROM)
ms0x003E马来语
ms_BN0x083E马来语(文莱达鲁萨兰)
ms_MY0x043E马来语(马来西亚)
mr0x004E马拉地语
mr_IN0x044E马拉地语(印度)
mn0x0050蒙古语
mn_MN0x0450蒙古语(蒙古)
no0x0014挪威语
nb_NO0x0414挪威语(伯克梅尔,挪威)
nn_NO0x0814挪威语(尼诺斯克,挪威)
pl0x0015波兰语
pl_PL0x0415波兰语(波兰)
pt0x0016葡萄牙语
pt_BR0x0416葡萄牙语(巴西)
pt_PT0x0816葡萄牙语(葡萄牙)
pa0x0046旁遮普语
pa_IN0x0446旁遮普语(印度)
ro0x0018罗马尼亚语
ro_RO0x0418罗马尼亚语(罗马尼亚)
ru0x0019俄语
ru_RU0x0419俄语(俄罗斯)
sa0x004F梵语
sa_IN0x044F梵语(印度)
sr_Cyrl_CS0x0C1A塞尔维亚语(塞尔维亚,西里尔语)
sr_Latn_CS0x081A塞尔维亚语(塞尔维亚,拉丁语)
sk0x001B斯洛伐克语
sk_SK0x041B斯洛伐克语(斯洛伐克)
sl0x0024斯洛文尼亚语
sl_SI0x0424斯洛文尼亚语(斯洛文尼亚)
es0x000A西班牙语
es_AR0x2C0A西班牙语(阿根廷)
es_BO0x400A西班牙语(玻利维亚)
es_CL0x340A西班牙语(智利)
es_CO0x240A西班牙语(哥伦比亚)
es_CR0x140A西班牙语(哥斯达黎加)
es_DO0x1C0A西班牙语(多米尼加共和国)
es_EC0x300A西班牙语(厄瓜多尔)
es_SV0x440A西班牙语(萨尔瓦多)
es_GT0x100A西班牙语(危地马拉)
es_HN0x480A西班牙语(洪都拉斯)
es_MX0x080A西班牙语(墨西哥)
es_NI0x4C0A西班牙语(尼加拉瓜)
es_PA0x180A西班牙语(巴拿马)
es_PY0x3C0A西班牙语(巴拉圭)
es_PE0x280A西班牙(秘鲁)
es_PR0x500A西班牙语(波多黎各)
es_ES0x0C0A西班牙语(西班牙)
es_UY0x380A西班牙语(乌拉圭)
es_VE0x200A西班牙语(委内瑞拉)
sw0x0041斯瓦希里语
sw_KE0x0441斯瓦希里语(肯尼亚)
sv0x001D瑞典语
sv_FI0x081D瑞典语(芬兰)
sv_SE0x041D瑞典语(瑞典)
syr0x005A叙利亚语
syr_SY0x045A叙利亚语(叙利亚)
ta0x0049泰米尔语
ta_IN0x0449泰米尔语(印度)
tt0x0044鞑靼语
tt_RU0x0444鞑靼语(俄罗斯)
te0x004A泰卢固语
te_IN0x044A泰卢固语(印度)
th0x001E泰语
th_TH0x041E泰语(泰国)
tr0x001F土耳其语
tr_TR0x041F土耳其语(土耳其)
uk0x0022乌克兰语
uk_UA0x0422乌克兰语(乌克兰)
ur0x0020乌尔都语
ur_PK0x0420乌尔都语(巴基斯坦)
uz0x0043乌兹别克语
uz_Cyrl_UZ0x0843乌兹别克语(乌兹别克斯坦,西里尔语)
uz_Latn_UZ0x0443乌兹别克语(乌兹别克斯坦,拉丁语)
vi0x002A越南语
vi_VN0x042A越南语(越南)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值