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

c16rtomb函数


概要:
#include <uchar.h>
size_t c16rtomb(char * restrict s, char16_t c16,
      mbstate_t * restrict ps);

描述:

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

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

其中参数buf为内部缓冲。


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


参数:
char * restrict s

指向char类型对象的指针,指向对象应足以容纳一个多字节字符。当前语言环境中单个多字节字符的最大字节数为MB_CUR_MAX

char16_t c16

char16_t类型的宽字符。

mbstate_t * restrict ps

指向mbstate_t类型对象的指针,该对象描述了多字节字符序列的当前转换状态,函数会根据需要对其进行更改。

如果参数ps是空指针,函数会使用内部mbstate_t对象,该对象在程序启动时初始化为初始转换状态;这种情况下,c16rtomb函数不要求避免与其它c16rtomb函数调用发生数据竞争。实现应像没有库函数使用ps空指针调用c16rtomb函数一样。


返回值:

函数返回存入参数s指向数组的字节数(包括移位序列)。如果参数c16不是一个有效的宽字符,将发生编码错误,函数将宏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 
/*函数c16rtomb范例*/

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

#define LENGTH 30

int main(void)
{
    setlocale(LC_CTYPE, "");

    const char16_t *uPtr = u"\u4e2d\u534e\u513f\u5973";
    static mbstate_t mbs;
    char arr[LENGTH];       //存储转换后的多字节字符序列。
    char *ptr = arr;         
    size_t number;          //存储c16rtomb函数的返回值。          

    while(*uPtr)
    {
        number = c16rtomb(ptr, *uPtr, &mbs);
        if(number == (size_t)(-1))
        {
            puts("Error: illegal sequence.");
            break;
        }

        ++uPtr;         //指向下一个宽字符。
        ptr += number;  //指向存储下一个多字节字符的位置。
    }

    *ptr = '\0';        //给多字节字符序列添加终止空字符。
    puts(arr);
    
    return 0;
}


输出:

中华儿女

注:使用ideone编译。


相关内容:
mbrtoc16 将多字节字符序列转换为16位宽字符的函数。
mbrtoc32 将多字节字符序列转换为32位宽字符的函数。
c32rtomb 32位宽字符转换为多字节字符序列的函数。