宽字符使用两个或四个字节表示一个字符,导致 C 语言常规的字符处理函数都会失效。wchar.h 定义了许多宽字符专用的处理函数。
wchar.h 定义了一个类型别名 wint_t,表示宽字符对应整数值。
wchar.h 还定义了一个宏 WEOF,表示文件结束字符 EOF 的宽字符版。
btowc()将单字节字符转换为宽字符,wctob()将宽字符转换为单字节字符。
btowc()
wctob()
wint_t btowc(int c); int wctob(wint_t c);
btowc()返回一个宽字符。如果参数是 EOF,或转换失败,则返回 WEOF。
wctob()返回一个单字节字符。如果参数是 WEOF,或者参数宽字符无法对应单个的单字节字符,则返回 EOF。
下面是用法示例。
wint_t wc = btowc('B'); // 输出宽字符 B wprintf(L"Wide character: %lc\n", wc); unsigned char c = wctob(wc); // 输出单字节字符 B wprintf(L"Single-byte character: %c\n", c);
fwide()用来设置一个字节流是宽字符流,还是多字节字符流。
fwide()
如果使用宽字符专用函数处理字节流,就会默认设置字节流为宽字符流,否则就需要使用fwide()显式设置。
int fwide(FILE* stream, int mode);
它接受两个参数,第一个参数是文件指针,第二个参数是字节流模式,有三种选择。
fwide()的返回值也分成三种情况:如果是宽字符流,返回一个正值;如果是多字节字符流,返回一个负值;如果是普通字符流,返回0。
0
一旦设置了字节流模式,就无法再更改。
#include <stdio.h> #include <wchar.h> int main(void) { wprintf(L"Hello world!\n"); int mode = fwide(stdout, 0); wprintf(L"Stream is %ls-oriented\n", mode < 0 ? L"byte" : L"wide"); }
上面示例中,wprintf()将字节流隐式设为宽字符模式,所以fwide(stdout, 0)的返回值大于零。
wprintf()
fwide(stdout, 0)
下面这些函数基本都是 stdio.h 里面的字符处理函数的宽字符版本,必须使用这些函数来操作宽字符。
wchar.h 也定义了一些多字节字符的专用函数。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8