当前位置:嗨网首页>书籍在线阅读

72-宽字符

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

B.7.6 宽字符

C99为使用宽字符提供更多支持,通过 wchar.hwctype.h 库包含了更多大型字符集。这两个头文件把 wchar_t 定义为一种整型类型,其确切的类型依赖实现。该类型用于存储扩展字符集中的字符,扩展字符集是是基本字符集的超集。根据定义, char 类型足够处理基本字符集,而 wchar_t 类型则需要更多位才能存储更大范围的编码值。例如, char 可能是 8 位字节, wchar_t 可能是 16 位的 unsigned short

L 前缀标识宽字符常量和字符串字面量,用 %lc%ls 显示宽字符数据:

wchar_t wch = L'I';
wchar_t w_arr[20] = L"am wide!";
printf("%lc %ls\n", wch, w_arr);

例如,如果把 wchar_t 实现为2字节单元, 'I' 的1字节编码应存储在 wch 的低位字节。不是标准字符集中的字符可能需要两个字节存储字符编码。例如,可以使用通用字符编码表示超出 char 类型范围的字符编码:

wchar_t w = L'\u00E2'; /* 16位编码值 */

内含 wchar_t 类型值的数组可用于存储宽字符串,每个元素存储一个宽字符编码。编码值为 0wchar_t 值是空字符的 wchar_t 类型等价字符。该字符被称为空宽字符(null wide character),用于表示宽字符串的结尾。

可以使用 %lc%ls 读取宽字符:

wchar_t wch1;
wchar_t w_arr[20];
puts("Enter your grade:");
scanf("%lc", &wch1);
puts("Enter your first name:");
scanf("%ls",w_arr);

wchar_t 头文件为宽字符提供更多支持,特别是提供了宽字符I/O函数、宽字符转换函数和宽字符串控制函数。例如,可以用 fwprintf()wprintf() 函数输出,用 fwscanf()wscanf() 函数输入。与一般输入 / 输出函数的主要区别是,这些函数需要宽字符格式字符串,处理的是宽字符输入 / 输出流。例如,下面的代码把信息作为宽字符显示:

wchar_t * pw = L"Points to a wide-character string";
int dozen = 12;
wprintf(L"Item %d: %ls\n", dozen, pw);

类似地,还有 getwchar()putwchar()fgetws()fputws() 函数。 wchar_t 头文件定义了一个 WEOF 宏,与 EOF 在面向字节的I/O中起的作用相同。该宏要求其值是一个与任何有效字符都不对应的值。因为 wchar_t 类型的值都有可能是有效字符,所以 wchar_t 库定义了一个 wint_t 类型,包含了所有 wchar_t 类型的值和 WEOF 的值。

该库中还有与 string.h 库等价的函数。例如, wcscpy(ws1, ws2)ws1 指定的宽字符串拷贝到 ws2 指向的宽字符数组中。类似地, wcscmp() 函数比较宽字符串,等等。

wctype.h 头文件新增了字符分类函数,例如,如果 iswdigit() 函数的宽字符参数是数字,则返回真;如果 iswblank() 函数的参数是空白,则返回真。空白的标准值是空格和水平制表符,分别写作 L''L'\t'

C11标准通过 uchar.h 头文件为宽字符提供更多支持,为匹配两种常用的统一码格式,定义了两个新类型。第1种类型是 char16_t ,可存储一个16位编码,是可用的最小无符号整数类型,用于 hexquard UCN形式和统一码UTF-16编码方案。

char16_t = '\u00F6';

第2种类型是 char32_t ,可存储一个32位编码,最小的可用无符号整数类型,。可用于 hexquard UCN形式和统一码UTF-32编码方案

char32_t = '\U0000AC01';

前缀 uU 分别表示 char16_tchar32_t 字符串。

char16_t ws16[11] = u"Tannh\u00E4user";
char32_t ws32[13] = U"caf\U000000E9 au lait";

注意,这两种类型比 wchar_t 类型更具体。例如,在一个系统中, wchar_t 可以存储32位编码,但是在另一个系统中也许只能存储16位的编码。另外,这两种新类型都与C++兼容。