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

wcrtomb函数


概要:
#include <wchar.h>
size_t wcrtomb(char * restrict s,
      wchar_t wc,
      mbstate_t * restrict ps);

描述:

该函数将宽字符wc转换为对应的多字节字符序列,存入参数s指向的数组。

如果参数s是空指针,wcrtomb函数等价于

wcrtomb(buf, L'\0', ps)

其中参数buf是内部缓冲。


如果参数s不是空指针,函数确定参数wc对应的多字节字符的字节数(包括移位序列。);并将多字节字符的表示形式存入参数s指向的数组。最多可以存入MB_CUR_MAX个字节。如果参数wc是空宽字符,一个空字节将存储到参数s指向的数组中(该空字节会被前置恢复初始移位状态所需的移位序列。),*ps描述的结果状态将是初始转换状态。


wctomb函数不同,wcrtomb函数存在一个额外参数ps,参数ps指向对象完整地描述了关联多字节字符序列的当前转换状态。如果参数ps是空指针,函数会使用内部mbstate_t对象,该对象在程序启动时初始化为初始转换状态;这种情况下,wcrtomb函数不要求避免与其它wcrtomb函数调用发生数据竞争。实现应像没有库函数使用ps空指针调用wcrtomb函数一样。wcrtomb函数的返回值不表示编码是否依赖于状态。


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


参数:
char * restrict s

指向char类型对象的指针。如果参数s不是空指针,转换得到的多字节字符序列将存入参数s指向的数组中。

wchar_t wc

wchar_t类型的宽字符。

mbstate_t * restrict ps

指向mbstate_t类型对象的指针,指向对象记录关联多字节字符序列的当前转换状态。


返回值:

函数返回存入参数s指向数组的字节数(包括移位序列)。如果参数wc不是一个有效的宽字符,将发生编码错误,函数将宏EILSEQ值存入errno,并返回(size_t)(-1),此外转换状态是不明确的。


范例:
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 
41 
42 
43 
44 
45 
46 
/*函数wcrtomb范例*/

#include <locale.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define LENGTH 100

int main(void)
{
    setlocale(LC_CTYPE, "");
    
    static mbstate_t state;
    const wchar_t wArr[] = L"天生我材必有用。";
    char arr[LENGTH];
    char *ptr = arr;
    size_t n;
    
    /*转换前。*/
    wprintf(L"转换前:\n");
    for(size_t i=0; i<sizeof(wArr)/sizeof(wchar_t); ++i)
        wprintf(L"%#X ", (unsigned int)wArr[i]);
    wprintf(L"\n");
    
    /*宽字符转换成多字节字符序列。*/
    for(size_t i=0; i<sizeof(wArr)/sizeof(wchar_t); ++i)
    {
        n = wcrtomb(ptr, wArr[i], &state);
        if(n == (size_t)(-1))
        {
            wprintf(L"编码错误。\n");
            exit(EXIT_FAILURE);
        }
        ptr += n;
    }
    
    /*转换后。*/
    wprintf(L"转换后:\n");
    for(ptrdiff_t i=0; i<(ptr-arr); ++i)
        wprintf(L"%#X ", (unsigned char)arr[i]);
    wprintf(L"\n");
    
    return 0;
}


输出:

转换前:

0X5929 0X751F 0X6211 0X6750 0X5FC5 0X6709 0X7528 0X3002 0

转换后:

0XE5 0XA4 0XA9 0XE7 0X94 0X9F 0XE6 0X88 0X91 0XE6 0X9D 0X90 0XE5 0XBF 0X85 0XE6 0X9C 0X89 0XE7 0X94 0XA8 0XE3 0X80 0X82 0

注:使用ideone.com编译。


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