wchar.h

宽字符使用两个或四个字节表示一个字符,导致 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

一旦设置了字节流模式,就无法再更改。

#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)的返回值大于零。

宽字符专用函数

下面这些函数基本都是 stdio.h 里面的字符处理函数的宽字符版本,必须使用这些函数来操作宽字符。

多字节字符专用函数

wchar.h 也定义了一些多字节字符的专用函数。