跳转至

第二十五章 国际化特性


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语言的标准的字符书写方式。