Jade Dungeon

国际化与本地化

locale.h 本地化

locale.h头中提供了地区化相关的数字格式、货币格式与日期格式的支持。

地区设置

setlocal()函数设置程序的地区,成功后返回的字符串与新地区类型相关联,失败 返回空指针:

char * setlocale( int category, const char * locale);
  1. 第一个参数设置地区影响哪些类别,头文件中定义一系列以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.hstrftime()。 还有 C99 中的wcsftime()
  1. 第二个参数设置地区,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 字符 的十六进制代码。不仅作为字符串字面量,还可以作为标识符。