编写的C语言程序可能在不同的国家或地区运行。不同的国家或地区有不同的语言、文化传统(例如字符、数值显示方式等),为了让C语言的程序能够来自不同国家和地区的人使用,需要考虑C语言的国际化。
locale
locale
是指根据计算机用户使用的语言、所在的国家或地区以及文化传统而定义的软件运行时的语言环境。在Linux
系统下打开Terminal
,输入locale
命令,就可查看当前系统使用的语言环境。
可见,locale
主要包括以下12类内容:
类型 | 含义 |
---|---|
LC_TYPE |
语言符号及其分类 |
LC_NUMERIC |
数字 |
LC_TIME |
时间格式信息 |
LC_COLLATE |
比较和排序习惯 |
LC_MONETARY |
货币单位 |
LC_MESSAGES |
提示信息、错误信息、状态信息、标题、标签、按钮和菜单等信息 |
LC_PAPER |
默认纸张尺寸大小 |
LC_NAME |
姓名书写方式 |
LC_ADDRESS |
地址书写方式 |
LC_TELEPHONE |
电话号码书写方式 |
LC_MEASUREMENT |
度量衡表达方式 |
LC_IDENTIFICATION |
对地域自身的描述信息 |
除了上述12项内容外,LANG
指定locale
未设置内容的默认值,大部分程序应用LANGUAGE
指定的语言作为界面语言。LC_ALL
同时设置所有的内容,并且其优先级比每个内容单独设置的优先级都高,而LANG
的优先级最低。
这12项内容的不同定义就形成不同的locale定义文件。Linux系统的locale定义文件在/usr/share/i18n/locales
:
locale
文件名称的格式一般为语言[_地域][.字符集][@修正值]
。例如de_DE.UTF-8@euro
是指语言为德文,地域为德国,字符集为UTF-8
,且根据欧洲习惯进行了修正。
C语言的本地化
<locale.h>
中提供了setlocale
函数,为不同的类型内容指定所属的locale
,进而影响标准库中一些函数的行为,其原型为:
char *setlocale(int category, const char *locale);
在C语言中第一个参数可选的类型及改变其所属locale
对标准库的行为的影响分别为:
LC_COLLATE
。影响两个字符串比较函数(strcoll
和strxfm
)的行为。LC_CTYPE
。影响<ctype.h>
除isdigit
和isxdigit
以外函数的行为。LC_MONETARY
。影响由localeconve
函数返回的货币格式信息。LC_NUMERIC
。影响格式化输入输出函数使用的小数点字符以及stdlib.h
中的字符串(atof
和strtod
)函数,及localeconv
函数返回的非货币信息。LC_TIME
。影响strftime
函数的行为。
第一个参数也可以是LC_ALL
,影响所有类型的行为。
第二个参数locale
为不同的locale
定义文件名。
当setlocale
调用成功,会返回一个指向与新locale
相关的字符串,如果调用失败,则返回空指针。C
语言标准默认提供了两种可能的locale
值,