当前位置: C语言 -- 标准库 -- <stdlib.h> -- mbtowc

mbtowc函数


概要:
#include <stdlib.h>
int mbtowc(wchar_t * restrict pwc,
      const char * restrict s,
      size_t n);

描述:

该函数将多字节字符序列转换为宽字符。

如果参数s不是空指针,函数从参数s指向的字节开始最多检查n个字节,以确定构成多字节字符所需的字节数(包括移位序列(shift sequences)。)。如果多字节字符是完整并且有效的,函数将确定对应的宽字符值;如果参数pwc不是空指针,函数将对应宽字符值存入参数pwc指向的对象中。如果对应的宽字符是空宽字符,函数处于初始转换状态(initial conversion state)。


mbtowc函数会受当前语言环境LC_CTYPE类别的影响。函数在程序启动时处于初始转换状态,调用mbtowc(NULL, NULL, 0);可以返回该状态;随后在参数s不是空指针的情况下调用该函数,内部转换状态将根据需要进行改变。改变LC_CTYPE类别会导致函数的转换状态不确定。

实现应像没有库函数调用mbtowc函数一样。


参数:
wchar_t * restrict pwc

指向wchar_t类型对象的指针,对应的宽字符将存入该指针指向的对象中。

const char * restrict s

指向多字节字符第一个字节的指针。

size_t n

最多检查的字节数。


返回值:

在参数s是空指针的情况下,如果多字节字符的编码与状态有关(state-dependent encodings),函数返回一个非0值;如果多字节字符的编码与状态无关,函数返回0

在参数s不是空指针的情况下,如果参数s指向空字符,函数返回0;如果参数s指向的不超过n个的字节能够形成有效多字节字符,函数返回多字节字符的字节数;如果不能形成有效多字节字符,函数返回-1

任何情况下,函数的返回值都不会大于参数n或者宏MB_CUR_MAX


范例:
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
32 
33 
34 
35 
36 
37 
38 
39 
40 
/*函数mbtowc范例*/

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    setlocale(LC_ALL, "");
    
    int i = 0;
    int numberOfByte;           //多字节字符的字节数。
    const char arr[] = "";    //需要转换的多字节字符序列。
    wchar_t wCh;                //存储转换后的宽字符。
    
    mbtowc(NULL, NULL, 0);      //初始化转换状态。
    
    /*多字节字符转换成宽字符前。*/
    printf("转换前多字节字符中各个字节的值:");
    while(arr[i] != 0)
    {
        printf(" %0X ", (unsigned char)arr[i++]);
    }
    
    /*多字节字符转换成宽字符。*/
    numberOfByte = mbtowc(&wCh, arr, MB_CUR_MAX);
    
    /*多字节字符转换成宽字符后。*/
    if(numberOfByte == 0)       //多字节字符序列是空字符。
        puts("转换的多字节字符序列是空字符。");
    
    if(numberOfByte == -1)      //多字节字符序列不能构成有效的多字节字符。
        puts("转换的多字节字符序列不能构成有效的多字节字符。");
    
    if(numberOfByte > 0)        //多字节字符序列能够构成有效的多字节字符。
        printf("\n转换后对应宽字符的值: %X\n", wCh);

    return 0;
}


输出:

转换前多字节字符中各个字节的值:  E5  AE  B6

转换后对应宽字符的值:  5BB6

注:使用ideone编译。

E5 AE B6汉字家的UTF-8编码5BB6汉字家的UTF-16BE编码


相关内容:
mblen 确定多字节字符字节数的函数。
wctomb 将宽字符转换为多字节字符序列的函数。