宽字符用2个或者4个字节表示一个字符,导致c语言常规的字符处理函数会失败,wchar.h定义了许多宽字符专用的处理函数。
类型别名和宏
wchar.h定义了一个宏名wint_t,表示宽字符对应的证书值。
wchar.h还定义类了一个WEOF,表示文件结束符EOF的宽字符版本。
btowc()和wctob()
btowc)用来把单字节字符转换成宽字符,wctob()用来把宽字符转换成单字节字符。
wint_t btowc(int );
int wctob(wint_t );
btowc返回一个宽字符。如果如果参数类型是EOF或者转换失败,那么返回WEOF。
wctob返回一个单字节字符。如果参数类型是WEOF或者无法对应单个的单字节字符,那么返回EOF。
下面是用法示例:
wint_t wc = btowc('B');
//输出宽字符B
wprintf(L"wide character:%lc\n",wc);
//输出单字节字符B
wprintf(L"Single-byte character:%c\n",wc);
fwide()
fwide()用来设置一个流是宽字符流,还是多字节字符流。
如果使用宽字符专用的函数去处理字节流,就会设置字节流为宽字符流,否则就使用fwide()显式设置。
int fwide(FILE * stream,int mode);
它接受两个参数,第一个参数是文件指针,第二个参数是字节流模式,有三种选择。
fwide()
的返回值也分成三种情况:如果是宽字符流,返回一个正值;如果是多字节字符流,返回一个负值;如果是普通字符流,返回0
。
一旦设置了字节流模式,就无法再更改。
#include <wchar.h>
#include <stdio.h>
int main(void)
{
wprintf(L"Hello,world!\n");
int mode;
mode = fwide(stdout,0);
wprintf(L"Stream is %ls - oriented\n",mode>0 ? L"byte" : L"wide");
return 0;
}
运行结果:
Hello,world!
Stream is wide - oriented
宽字符专用函数
下面这些函数基本都是 stdio.h 里面的字符处理函数的宽字符版本,必须使用这些函数来操作宽字符。
fgetwc() 从宽字符流中获取宽字符,对应 fgetc()。
fgetws() 从宽字符流中读取宽字符串,对应 fgets()。
fputwc() 将宽字符写入宽字符流,对应 fputc()。
fputws() 将宽字符串写入宽字符流,对应 fputs()。
fwprintf() 格式化宽输出到宽字符流,对应 fprintf()。
fwscanf() 来自宽字符流的格式化宽字符输入,对应 fscanf()。
getwchar() 从 stdin 获取一个宽字符,对应 getchar()。
getwc() 从 stdin 获取一个宽字符,对应 getc()。
putwchar() 写一个宽字符到 stdout,对应 putchar()。
putwc() 写一个宽字符到 stdout,对应 putc()。
swprintf() 格式化宽输出到宽字符串,对应 sprintf()。
swscanf() 来自宽字符串的格式化宽输入,对应 sscanf()。
ungetwc() 将宽字符推回输入流,对应 ungetc()。
vfwprintf() 可变参数的格式化宽字符输出到宽字符流,对应 vfprintf()。
vfwscanf() 来自宽字符流的可变参数格式化宽字符输入,对应 vfscanf()。
vswprintf() 可变参数的格式化宽字符输出到宽字符串,对应 vswprintf()。
vswscanf() 来自宽字符串的可变参数格式化宽字符输入,对应 vsscanf()。
vwprintf() 可变参数格式化宽字符输出,对应 vprintf()。
vwscanf() 可变参数的格式化宽字符输入,对应 vscanf()。
wcscat() 危险地连接宽字符串,对应 strcat()。
wcschr() 在宽字符串中查找宽字符,对应 strchr()。
wcscmp() 比较宽字符串,对应 strcmp()。
wcscoll() 比较两个考虑语言环境的宽字符串,对应 strcoll()。
wcscpy() 危险地复制宽字符串,对应 strcpy()。
wcscspn() 不是从宽字符串前面开始计算字符,对应 strcspn()。
wcsftime() 格式化的日期和时间输出,对应 strftime()。
wcslen() 返回宽字符串的长度,对应 strlen()。
wcsncat() 更安全地连接宽字符串,对应 strncat()。
wcsncmp() 比较宽字符串,长度有限,对应 strncmp()。
wcsncpy() 更安全地复制宽字符串,对应 strncpy()。
wcspbrk() 在宽字符串中搜索一组宽字符中的一个,对应 strpbrk()。
wcsrchr() 从末尾开始在宽字符串中查找宽字符,对应 strrchr()。
wcsspn() 从宽字符串前面的集合中计算字符,对应 strspn()。
wcsstr() 在另一个宽字符串中找到一个宽字符串,对应 strstr()。
wcstod() 将宽字符串转换为 double,对应 strtod()。
wcstof() 将宽字符串转换为 float,对应 strtof()。
wcstok() 标记一个宽字符串,对应 strtok()。
wcstold() 将宽字符串转换为 long double,对应 strtold()。
wcstoll() 将宽字符串转换为 long long,对应 strtoll()。
wcstol() 将宽字符串转换为 long,对应 strtol()。
wcstoull() 将宽字符串转换为 unsigned long long,对应 strtoull()。
wcstoul() 将宽字符串转换为 unsigned long,对应 strtoul()。
wcsxfrm() 转换宽字符串以根据语言环境进行比较,对应 strxfrm()。
wmemcmp() 比较内存中的宽字符,对应 memcmp()。
wmemcpy() 复制宽字符内存,对应 memcpy()。
wmemmove() 复制宽字符内存,可能重叠,对应 memmove()。
wprintf() 格式化宽输出,对应 printf()。
wscanf() 格式化宽输入,对应 scanf()。
多字节字符专用函数
wchar.h 也定义了一些多字节字符的专用函数。
mbsinit() 判断 mbstate_t 是否处于初始转换状态。
mbrlen() 给定转换状态时,计算多字节字符串的字节数,对应 mblen()。
mbrtowc() 给定转换状态时,将多字节字符转换为宽字符,对应 mbtowc()。
wctombr() 给定转换状态时,将宽字符转换为多字节字符,对应 wctomb()。
mbsrtowcs() 给定转换状态时,将多字节字符串转换为宽字符串,对应 mbstowcs()。
wcsrtombs() 给定转换状态时,将宽字符串转换为多字节字符串,对应 wcstombs()。