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 表示字符集编码,例如 UTF-8 或者 GBK。modifier是修正符,有些地方会用到,例如:de_DE@euro使用的是欧洲的排序、比较和缩进习惯,而de_DE用的是德国的标准习惯,这是两套不同的标准。还有两个比较特殊的值是和分别代表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值

5、LC_ALL=C的含义

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

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

6、locale定义文件

/usr/share/i18n/locales目录下

7、自定义locale

/usr/lib/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结构体

序号 成员 描述
1 decimal_point

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

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

2 thousands_sep

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

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

3 grouping 

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

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

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

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

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

grouping 被设置为”123″,那么数字的分隔效果为 12,172,390,00,0; grouping 被设置为”31″,那么数字的分隔效果为 1,2,1,7,2,3,9,0,000; grouping 被设置为”13″,那么数字的分隔效果为 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()函数

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

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

12、setlocale()函数

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

参数 category:

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

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

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

3 LC_CTYPE

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

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

4 LC_MONETARY

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

例如,美元的货币符号是,国际代码是;人民币的货币符号是,国际代码是;英镑的货币符号是,国际代码是。

5 LC_NUMERIC

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

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

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

例如,美国地区书写日期的格式是,比如;而大陆地区书写日期的格式是,比如。

参数 locale:地域设置的名称(字符串)。对于不同的平台和不同的编译器,地域设置的名称可能会不同。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 丹麦语来源:邻居家的小南瓜

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年4月8日
下一篇 2022年4月8日

相关推荐