第二十五章 国际化特性
locale.h 本地化
locale.h提供的函数用于控制标准库中对于不同的地区会不一样的部分。
地区通常指一个国家,或者一个国家的不同区域。
在标准库中,依赖地区的部分包括:
-
数值的格式。比如一些地区的小数点是用逗号表示
-
货币的格式。不同国家的货币符号不同。
-
字符集。字符集依赖于地区使用的语言。亚洲国家通常比西方国家需要更大的字符集。
-
日期和时间的表示格式。
类别
通过修改地区,程序可以改变它的行为来适应不同地区。
可以使用一些宏来指定一个类型:
-
LC_COLLATE。影响两个字符串比较函数的行为(strcoll和strxfm)。
-
LC_CTYPE。影响ctype.h中函数的行为,除了isdigit和isxdigit。同时还影响stdlib.h中的多字节函数。
-
LC_MONETRAY。影响由localeconv函数返回的货币格式信息。
-
LC_NUMERIC。影响格式化输入/输出函数使用的小数点字符以及stdlib.h中的字符串转换函数(atof和strtod),还会影响localeconv函数返回的非货币格式信息。
-
LC_TIME。影响strftime函数的行为,该函数将时间转换成字符串。
setlocale函数
char *setlocale(int category, const char *locale);
setlocale函数修改当前的地区。如果第一个参数是LC_ALL,就会影响所有的类型。C语言标准对第二个参数仅定义了两种可能值:"c"和""。其余的由实现定义,比如, gcc 对于简体中文的地区,可以是"zh_CN.UTF-8"
程序执行开始时,都会隐含调用:setlocale(LC_ALL, "C");
如果用""作为第二个参数,就切换到了本地模式(native locale),这种模式下程序会适应本地的环境。
如果调用成功,返回一个关于地区名字的字符串指针。如果调用失败,返回空指针。
setlocale函数也可以当作搜索函数使用,如果第二个参数是空指针,setlocale函数会返回一个指向字符串的指针,这个字符串与当前地区类型的设置相关联。
localeconv函数
struct lconv *localeconv(void);
函数返回的struct lconv结构包含了当前地区的详细信息,此结构具有静态存储期限。
详细信息参考书本。
多字节字符和宽字符
因为定义已经把char型值的大小限制为一个字节,所以通过改变char类型的含义来处理更大的字符集显然是不可能的。
C语言提供了两种可扩展字符集的编码:多字节字符(multibyte character)和宽字符(wide character)。
C标准要求0字节始终用来表示空字符。
多字节字符
在多字节字符编码中,一个或多个字节表示一个可扩展字符。C语言要求的基本字符是单字节的。
一些多字节字符集依靠依赖状态编码(state-dependent encoding)。在这类编码中,每个多字节字符序列都以初始移位状态(initial shift state)开始。序列中稍后遇到的一些多字节字符会改变移位状态,并且影响后续字节的含义。
MB_LEN_MAX和MB_CUR_MAX说明了多字节字符中字节的最大数量。MB_LEN_MAX定义在limits.h中,给出了任意支持地区的最大值。MB_CUR_MAX定义在stdlib.h中,给出了当前地区的最大值。
宽字符
宽字符是一种其值表示字符的整数,所有宽字符要求相同的字节数。
宽字符具有wchar_t类型。
一个宽字符常量可以写成:L'a'
一个宽字符字符串可以写成:L"abc"
即在普通字符常量前用字母L作为前缀。
my note
注意,在使用宽字符前,需要设置好本地环境,比如,要使用简体中文的宽字符,那么要先执行 setlocale(LC_ALL, "zh_CN.UTF-8")
,这样才能正确地解析宽字符。
多字节字符函数
#include <stdlib.h>
int mblen(const char *s, size_t n);
int mbtowc(wchar_t *pwc, const char *s, size_t n);
int wctomb(char *s, wchar_t wc);
多字节字符串函数
#include <stdlib.h>
size_t mbstowcs(wchar_t *dest, const char *src, size_t n);
size_t wcstombs(char *dest, const wchar_t *src, size_t n);
三字符序列
见书本简要介绍。
Note
这就是一种字符替换方式,由于某些国家不支持C语言的标准的字符书写方式。