目录
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用的是德国的标准习惯,这是两套不同的标准。还有两个比较特殊的值是C
和POSIX
分别代表C标准和POSIX标准,这两种标准对于数据的显示方式、排序方式等都有各自的规定。
注:charset 可以省略,此时会选择当前语言的默认charset(Linux 发行版大都使用 UTF-8 编码);
3、locale分类
1 | LC_CTYPE | 语言符号及其分类 |
2 | LC_NUMERIC | 数字 |
3 | LC_COLLATE | 比较和排序习惯 |
4 | LC_TIME | 时间显示格式 |
5 | LC_MONETARY | 货币单位 |
6 | LC_MESSAGES | 信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等 |
7 | LC_NAME | 姓名书写方式 |
8 | LC_ADDRESS | 地址书写方式 |
9 | LC_TELEPHONE | 电话号码书写方式 |
10 | LC_MEASUREMENT | 度量衡表达方式 |
11 | LC_PAPER | 默认纸张尺寸大小 |
12 | LC_IDENTIFICATION | 对locale自身包含信息的概述 |
13 | LC_ALL | 设置所有的LC_*的变量 |
14 | LANG | 缺省值,为所有未设置的区域设置变量指定默认区域设置。 |
15 | LANGUAGE | 大多数程序将此作为其界面语言。 |
注:LC_ALL,LANG和LC_*均不指定特定值的话,系统将采用默认locale(C locale或POSIX locale)。
4、Local设定的优先级
优先级 | 描述 |
1 | LANGUAGE 优先级最高 ,指定个人对语言环境值的主次偏好,例如zh_CN:en_US:en,冒号分隔的是多种选择。 |
2 | LC_ALL 设置的值 |
3 | LC_* 可设定locale各方面(category)的值,可以覆盖LANG的值。 |
4 | LANG 指定默认使用的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
序号 | 成员 | 描述 |
1 | decimal_point | 用于非货币值的小数点字符。 注:通常认为小数点就是点号;但在法语、南非语、丹麦语、德语、希腊语、部分西班牙语中,小数点是逗号。 |
2 | thousands_sep | 用于非货币值的千位分隔符。 注:在数字中,每隔三位数加入一个分隔符,以便更加容易认出数值。 |
3 | grouping | 一个表示非货币量中每组数字大小的字符串。每个字符代表一个整数值,每个整数指定当前组的位数。值为 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。 |
4 | int_curr_symbol | 国际货币符号使用的字符串。前三个字符是由 ISO 4217:1987标准指定(例如,美元的国际符号是 |
5 | currency_symbol | 本地货币符号(美元的货币符号为 |
6 | mon_decimal_point | 用于货币值的小数点字符。 |
7 | mon_thousands_sep | 用于货币值的千位分隔符。 |
8 | mon_grouping | 和grouping类似,不过 grouping 针对的是当地货币格式,而 mon_grouping针对的是国际货币格式。 |
9 | positive_sign | 用于正货币值的字符(一般为空字符串)。 |
10 | negative_sign | 用于负货币值的字符(一般为负号)。 |
11 | int_frac_digits | 国际货币值中小数点后要显示的位数。 |
12 | frac_digits | 货币值中小数点后要显示的位数。 |
13 | p_cs_precedes | 如果等于 1,则 currency_symbol 出现在正货币值之前。 如果等于 0,则 currency_symbol 出现在正货币值之后。 |
14 | p_sep_by_space | 如果等于 1,则 currency_symbol 和正货币值之间使用空格分隔。 如果等于 0,则 currency_symbol 和正货币值之间不使用空格分隔。 |
15 | n_cs_precedes | 如果等于 1,则 currency_symbol 出现在负货币值之前。 如果等于 0,则 currency_symbol 出现在负货币值之后。 |
16 | n_sep_by_space | 如果等于 1,则 currency_symbol 和负货币值之间使用空格分隔。 如果等于 0,则 currency_symbol 和负货币值之间不使用空格分隔。 |
17 | p_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 之后。 |
18 | n_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 之后。 |
19 | int_p_cs_precedes | 和 p_cs_precedes 类似。不过 p_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_p_cs_precedes 针对的是国际货币格式。 |
20 | int_n_cs_precedes | 和 n_cs_precedes 类似。不过 n_cs_precedes 针对的是当地(当前区域设置)的货币格式,而 int_n_cs_precedes 针对的是国际货币格式。 |
21 | int_p_sep_by_space | 和 p_sep_by_space 类似。不过 p_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_p_sep_by_space 针对的是国际货币格式。 |
22 | int_n_sep_by_space | 和 n_sep_by_space 类似。不过 n_sep_by_space 针对的是当地(当前区域设置)的货币格式,而 int_n_sep_by_space 针对的是国际货币格式。 |
23 | int_p_sign_posn | 和 p_sign_posn 类似。不过 p_sign_posn 针对的是当地(当前区域设置)的货币格式,而 int_p_sign_posn 针对的是国际货币格式。 |
24 | int_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:
1 | LC_ALL | 设置下面的所有选项。 |
2 | LC_COLLATE | 影响字符比较(字符排序)。具体来说就是影响 <string.h> 头文件中的 strcoll() 和 strxfrm() 函数。
|
3 | LC_CTYPE | 语言符号及其分类.语言符号及其分类。影响所有字符函数。例如 strtoupper()。 注:LC_CTYPE 的影响范围最大,可以说是地域设置中最重要的一项内容。 |
4 | LC_MONETARY | 影响 localeconv 函数提供的货币信息。针对 localeconv()。 例如,美元的货币符号是 |
5 | LC_NUMERIC | 影响数字格式,包括小数点(用哪个字符来表示小数点)、数字分组等。针对 localeconv()。 世界上大部分地区都使用 |
6 | LC_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 | 固定区域性 |
af | 0x0036 | 南非荷兰语 |
af_ZA | 0x0436 | 南非荷兰语(南非) |
sq | 0x001C | 阿尔巴尼亚语 |
sq_AL | 0x041C | 阿尔巴尼亚语(阿尔巴尼亚) |
ar | 0x0001 | 阿拉伯语 |
ar_DZ | 0x1401 | 阿拉伯语(阿尔及利亚) |
ar_BH | 0x3C01 | 阿拉伯语(巴林) |
ar_EG | 0x0C01 | 阿拉伯语(埃及) |
ar_IQ | 0x0801 | 阿拉伯语(伊拉克) |
ar_JO | 0x2C01 | 阿拉伯语(约旦) |
ar_KW | 0x3401 | 阿拉伯语(科威特) |
ar_LB | 0x3001 | 阿拉伯语(黎巴嫩) |
ar_LY | 0x1001 | 阿拉伯语(利比亚) |
ar_MA | 0x1801 | 阿拉伯语(摩洛哥) |
ar_OM | 0x2001 | 阿拉伯语(阿曼) |
ar_QA | 0x4001 | 阿拉伯语(卡塔尔) |
ar_SA | 0x0401 | 阿拉伯语(沙特阿拉伯) |
ar_SY | 0x2801 | 阿拉伯语(叙利亚) |
ar_TN | 0x1C01 | 阿拉伯语(突尼斯) |
ar_AE | 0x3801 | 阿拉伯语(阿联酋) |
ar_YE | 0x2401 | 阿拉伯语(也门) |
hy | 0x002B | 亚美尼亚语 |
hy_AM | 0x042B | 亚美尼亚语(亚美尼亚) |
az | 0x002C | 阿泽里语 |
az_Cyrl_AZ | 0x082C | 阿泽里语(阿塞拜疆,西里尔语) |
az_Latn_AZ | 0x042C | 阿泽里语(阿塞拜疆,拉丁语) |
eu | 0x002D | 巴斯克语 |
eu_ES | 0x042D | 巴斯克语(巴斯克地区) |
be | 0x0023 | 白俄罗斯语 |
be_BY | 0x0423 | 白俄罗斯语(白俄罗斯) |
bg | 0x0002 | 保加利亚语 |
bg_BG | 0x0402 | 保加利亚语(保加利亚) |
ca | 0x0003 | 加泰罗尼亚语 |
ca_ES | 0x0403 | 加泰罗尼亚语(加泰罗尼亚地区) |
zh_HK | 0x0C04 | 中文(香港特别行政区,中国) |
zh_MO | 0x1404 | 中文(澳门特别行政区) |
zh_CN | 0x0804 | 中文(中国) |
zh_Hans | 0x0004 | 中文(简体) |
zh_SG | 0x1004 | 中文(新加坡) |
zh_TW | 0x0404 | 中文(台湾) |
zh_Hant | 0x7C04 | 中文(繁体) |
hr | 0x001A | 克罗地亚语 |
hr_HR | 0x041A | 克罗地亚语(克罗地亚) |
cs | 0x0005 | 捷克语 |
cs_CZ | 0x0405 | 捷克语(捷克共和国) |
da | 0x0006 | 丹麦语 |
da_DK | 0x0406 | 丹麦语(丹麦) |
dv | 0x0065 | 迪维希语 |
dv_MV | 0x0465 | 迪维希语(马尔代夫) |
nl | 0x0013 | 荷兰语 |
nl_BE | 0x0813 | 荷兰语(比利时) |
nl_NL | 0x0413 | 荷兰语(荷兰) |
en | 0x0009 | 英语 |
en_AU | 0x0C09 | 英语(澳大利亚) |
en_BZ | 0x2809 | 英语(伯利兹) |
en_CA | 0x1009 | 英语(加拿大) |
en_029 | 0x2409 | 英语(加勒比) |
en_IE | 0x1809 | 英语(爱尔兰) |
en_JM | 0x2009 | 英语(牙买加) |
en_NZ | 0x1409 | 英语(新西兰) |
en_PH | 0x3409 | 英语(菲律宾) |
en_ZA | 0x1C09 | 英语(南非) |
en_TT | 0x2C09 | 英语(特立尼达和多巴哥) |
en_GB | 0x0809 | 英语(英国) |
en_US | 0x0409 | 英语(美国) |
en_ZW | 0x3009 | 英语(津巴布韦) |
et | 0x0025 | 爱沙尼亚语 |
et_EE | 0x0425 | 爱沙尼亚语(爱沙尼亚) |
fo | 0x0038 | 法罗语 |
fo_FO | 0x0438 | 法罗语(法罗群岛) |
fa | 0x0029 | 波斯语 |
fa_IR | 0x0429 | 波斯语(伊朗) |
fi | 0x000B | 芬兰语 |
fi_FI | 0x040B | 芬兰语(芬兰) |
fr | 0x000C | 法语 |
fr_BE | 0x080C | 法语(比利时) |
fr_CA | 0x0C0C | 法语(加拿大) |
fr_FR | 0x040C | 法语(法国) |
fr_LU | 0x140C | 法语(卢森堡) |
fr_MC | 0x180C | 法语(摩纳哥) |
fr_CH | 0x100C | 法语(瑞士) |
gl | 0x0056 | 加利西亚语 |
gl_ES | 0x0456 | 加利西亚语(西班牙) |
ka | 0x0037 | 格鲁吉亚语 |
ka_GE | 0x0437 | 格鲁吉亚语(格鲁吉亚) |
de | 0x0007 | 德语 |
de_AT | 0x0C07 | 德语(奥地利) |
de_DE | 0x0407 | 德语(德国) |
de_LI | 0x1407 | 德语(列支敦士登) |
de_LU | 0x1007 | 德语(卢森堡) |
de_CH | 0x0807 | 德语(瑞士) |
el | 0x0008 | 希腊语 |
el_GR | 0x0408 | 希腊语(希腊) |
gu | 0x0047 | 古吉拉特语 |
gu_IN | 0x0447 | 古吉拉特语(印度) |
he | 0x000D | 希伯来语 |
he_IL | 0x040D | 希伯来语(以色列) |
hi | 0x0039 | 印地语 |
hi_IN | 0x0439 | 印地语(印度) |
hu | 0x000E | 匈牙利语 |
hu_HU | 0x040E | 匈牙利语(匈牙利) |
is | 0x000F | 冰岛语 |
is_IS | 0x040F | 冰岛语(冰岛) |
id | 0x0021 | 印度尼西亚语 |
id_ID | 0x0421 | 印度尼西亚语(印度尼西亚) |
it | 0x0010 | 意大利语 |
it_IT | 0x0410 | 意大利语(意大利) |
it_CH | 0x0810 | 意大利语(瑞士) |
ja | 0x0011 | 日语 |
ja_JP | 0x0411 | 日语(日本) |
kn | 0x004B | 卡纳达语 |
kn_IN | 0x044B | 卡纳达语(印度) |
kk | 0x003F | 哈萨克语 |
kk_KZ | 0x043F | 哈萨克语(哈萨克斯坦) |
kok | 0x0057 | 贡根语 |
kok_IN | 0x0457 | 贡根语(印度) |
ko | 0x0012 | 朝鲜语 |
ko_KR | 0x0412 | 朝鲜语(韩国) |
ky | 0x0040 | 吉尔吉斯语 |
ky_KG | 0x0440 | 吉尔吉斯语(吉尔吉斯坦) |
lv | 0x0026 | 拉脱维亚语 |
lv_LV | 0x0426 | 拉脱维亚语(拉脱维亚) |
lt | 0x0027 | 立陶宛语 |
lt_LT | 0x0427 | 立陶宛语(立陶宛) |
mk | 0x002F | 马其顿语 |
mk_MK | 0x042F | 马其顿语(马其顿,FYROM) |
ms | 0x003E | 马来语 |
ms_BN | 0x083E | 马来语(文莱达鲁萨兰) |
ms_MY | 0x043E | 马来语(马来西亚) |
mr | 0x004E | 马拉地语 |
mr_IN | 0x044E | 马拉地语(印度) |
mn | 0x0050 | 蒙古语 |
mn_MN | 0x0450 | 蒙古语(蒙古) |
no | 0x0014 | 挪威语 |
nb_NO | 0x0414 | 挪威语(伯克梅尔,挪威) |
nn_NO | 0x0814 | 挪威语(尼诺斯克,挪威) |
pl | 0x0015 | 波兰语 |
pl_PL | 0x0415 | 波兰语(波兰) |
pt | 0x0016 | 葡萄牙语 |
pt_BR | 0x0416 | 葡萄牙语(巴西) |
pt_PT | 0x0816 | 葡萄牙语(葡萄牙) |
pa | 0x0046 | 旁遮普语 |
pa_IN | 0x0446 | 旁遮普语(印度) |
ro | 0x0018 | 罗马尼亚语 |
ro_RO | 0x0418 | 罗马尼亚语(罗马尼亚) |
ru | 0x0019 | 俄语 |
ru_RU | 0x0419 | 俄语(俄罗斯) |
sa | 0x004F | 梵语 |
sa_IN | 0x044F | 梵语(印度) |
sr_Cyrl_CS | 0x0C1A | 塞尔维亚语(塞尔维亚,西里尔语) |
sr_Latn_CS | 0x081A | 塞尔维亚语(塞尔维亚,拉丁语) |
sk | 0x001B | 斯洛伐克语 |
sk_SK | 0x041B | 斯洛伐克语(斯洛伐克) |
sl | 0x0024 | 斯洛文尼亚语 |
sl_SI | 0x0424 | 斯洛文尼亚语(斯洛文尼亚) |
es | 0x000A | 西班牙语 |
es_AR | 0x2C0A | 西班牙语(阿根廷) |
es_BO | 0x400A | 西班牙语(玻利维亚) |
es_CL | 0x340A | 西班牙语(智利) |
es_CO | 0x240A | 西班牙语(哥伦比亚) |
es_CR | 0x140A | 西班牙语(哥斯达黎加) |
es_DO | 0x1C0A | 西班牙语(多米尼加共和国) |
es_EC | 0x300A | 西班牙语(厄瓜多尔) |
es_SV | 0x440A | 西班牙语(萨尔瓦多) |
es_GT | 0x100A | 西班牙语(危地马拉) |
es_HN | 0x480A | 西班牙语(洪都拉斯) |
es_MX | 0x080A | 西班牙语(墨西哥) |
es_NI | 0x4C0A | 西班牙语(尼加拉瓜) |
es_PA | 0x180A | 西班牙语(巴拿马) |
es_PY | 0x3C0A | 西班牙语(巴拉圭) |
es_PE | 0x280A | 西班牙(秘鲁) |
es_PR | 0x500A | 西班牙语(波多黎各) |
es_ES | 0x0C0A | 西班牙语(西班牙) |
es_UY | 0x380A | 西班牙语(乌拉圭) |
es_VE | 0x200A | 西班牙语(委内瑞拉) |
sw | 0x0041 | 斯瓦希里语 |
sw_KE | 0x0441 | 斯瓦希里语(肯尼亚) |
sv | 0x001D | 瑞典语 |
sv_FI | 0x081D | 瑞典语(芬兰) |
sv_SE | 0x041D | 瑞典语(瑞典) |
syr | 0x005A | 叙利亚语 |
syr_SY | 0x045A | 叙利亚语(叙利亚) |
ta | 0x0049 | 泰米尔语 |
ta_IN | 0x0449 | 泰米尔语(印度) |
tt | 0x0044 | 鞑靼语 |
tt_RU | 0x0444 | 鞑靼语(俄罗斯) |
te | 0x004A | 泰卢固语 |
te_IN | 0x044A | 泰卢固语(印度) |
th | 0x001E | 泰语 |
th_TH | 0x041E | 泰语(泰国) |
tr | 0x001F | 土耳其语 |
tr_TR | 0x041F | 土耳其语(土耳其) |
uk | 0x0022 | 乌克兰语 |
uk_UA | 0x0422 | 乌克兰语(乌克兰) |
ur | 0x0020 | 乌尔都语 |
ur_PK | 0x0420 | 乌尔都语(巴基斯坦) |
uz | 0x0043 | 乌兹别克语 |
uz_Cyrl_UZ | 0x0843 | 乌兹别克语(乌兹别克斯坦,西里尔语) |
uz_Latn_UZ | 0x0443 | 乌兹别克语(乌兹别克斯坦,拉丁语) |
vi | 0x002A | 越南语 |
vi_VN | 0x042A | 越南语(越南) |