国际化与本地化
locale.h 本地化
locale.h
头中提供了地区化相关的数字格式、货币格式与日期格式的支持。
地区设置
setlocal()
函数设置程序的地区,成功后返回的字符串与新地区类型相关联,失败
返回空指针:
char * setlocale( int category, const char * locale);
-
第一个参数设置地区影响哪些类别,头文件中定义一系列以
LC_
开头的宏设定地区化设置 会影响到哪些函数的行为,常用的有:-
LC_ALL
:会影响所有的类别。 -
LC_COLLATE
:会影响string.h
中字符串比较函数strcoll()
和strxfrm()
的 行为。 -
LC_CTYPE
:会影响ctype.h
中除了isdigit()
和isxdigit()
的函数以外的 其他函数。还有会影响多字节和宽字符函数的行为。 -
LC_MONETARY
:会影响由localeconv()
函数返回货币函数的信息。 -
LC_NUMERIC
:会影响输入输出函数使用的小数点字符以及stdlib.h
中的 数值转换函数如:strtod()
等。还有localeconv()
函数的返回非货币格式信息。 -
LC_TIME:
会影响把时间转换为字符串行为,如:time.h
中strftime()
。 还有 C99 中的wcsftime()
。
-
-
第二个参数设置地区,C 标准只定义了
"C"
和""
两个。其他的地区各编译器实现 自己定义。
任何程序启动时会隐含执行调用:
setlocal(LC_ALL, " "):
在程序运行过程中可以通过调用:
setlocal(LC_ALL, " "):
切换到本地模式。
但各编译器实现不一样:
-
有的会检查当前系统环境(与
getenv()
函数一样) - 有的编译器什么也不做。
关于各地区的格式,GNU 的 C 库(glibc)实现了 POSIX 地区格式:
语言 [_ 地域][. 编码集][@ 修饰符]
例如:
-
en_GB
:英语-大不列颠联合王国 -
en_IE
:英语-爱尔兰 -
en_IE@euro
:英语-爱尔兰,使用欧元 -
en_IE.utf8
:英语-爱尔兰,utf8 字符集
Linux 环境下可以通过locale -a
命令输出所以系统支持的地区列表。
如果setlocale()
函数的第二个参数空指针,会返回一个与当前地区类别相关的
字符指针。这个字符串可以复制到变量中以便以后调用setlocale()
时使用。
本地化设置
setlocale()
函数可以取得配置的地区信息,然后与地区信息相关的金额格式日期格式等
信息设置要用到 locale.h 头中提供的localeconv()
函数。
struct lconv * localeconv( void );
返回的lconv
数据结构具有静态存储期限,包含了地区内容的详细设置。具体字段
请RTFM。
多字节字符与宽字符
宽字符
stddef.h
头中提供了wchar_t
。以字母L
作为前缀,例如:
-
L'a'
-
L"abc"
统一码编码
UTF-8 使用多字节方式实现统一码,每个码点需要 1 到 4 个字节:
000000 ~ 00007F | 0xxxxxxx |
000080 ~ 0007FF | 110xxxxx 10xxxxxx |
000800 ~ 00FFFF | 1110xxxx 10xxxxxx 10xxxxxx |
010000 ~ 10FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
C99 中通用字符名
C99 中提供的通用字符名(\udddd
和\Udddddddd
)可能在程序源代码中使用 UCS 字符
的十六进制代码。不仅作为字符串字面量,还可以作为标识符。