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

wctomb函数


概要:
#include <stdlib.h>
int wctomb(char *s, wchar_t wc);

描述:

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

该函数确定参数wc对应的多字节字符的字节数(包括移位序列(shift sequences)。);如果参数s不是空指针,函数将对应的多字节字符序列存入参数s指向的数组中,最多可以存储MB_CUR_MAX个字符。如果参数wc是空宽字符,将存入空字节,该空字节会被前置用以恢复初始移位状态(initial shift state)的移位序列,并且函数处于初始转换状态(initial conversion state)。


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

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

ISO/IEC 9899:2018标准定义了该函数的安全版本wctomb_s


参数:
char *s

指向char类型数组首元素的指针,转换得到的多字节字符序列将存储在该数组中。

wchar_t wc

wchar_t类型的宽字符。


返回值:

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

在参数s不是空指针的情况下,如果参数wc存在对应的有效多字节字符,函数返回多字节字符的字节数;如果参数wc不存在对应的有效多字节字符,函数返回-1

任何情况下,函数返回值都不会大于宏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 
/*函数wctomb范例*/

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

int main(void)
{
    setlocale(LC_ALL, "");
    
    int numberOfByte;           //存储多字节字符的字节数。
    char arr[MB_CUR_MAX];       //存储转换后的多字节字符序列。
    wchar_t wCh = L'';

    /*宽字符转换成多字节字符前。*/
    printf("转换前宽字符的值:%X\n", wCh);

    /*宽字符转换成多字节字符。*/
    numberOfByte = wctomb(arr, wCh);

    /*宽字符转换成多字节字符后。*/
    if(numberOfByte == -1)              //不能形成有效多字节字符。
        puts("宽字符没有对应的有效多字节字符。");

    printf("转换后多字节字符各个字节的值:");
    for(int i=0; i<numberOfByte; ++i)   //能够形成有效多字节字符。
        printf(" %0X ", (unsigned char)arr[i]);
        
    return 0;
}


输出:

转换前宽字符的值:  7434

转换后多字节字符各个字节的值:  E7  90  B4

注:使用ideone编译。

7434汉字琴的UTF-16BE编码E7 90 B4汉字琴的UTF-8编码


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