非常教程

C参考手册

字符串 | Strings

c16rtomb

在头文件<uchar.h>中定义

size_t c16rtomb(char * s,char16_t c16,mbstate_t * ps);

(自C11以来)

将单个代码点从其可变长度的16位宽字符表示(通常为UTF-16)转换为其窄多字节字符表示形式。

如果s不是空指针并且c16是代码点的有效可变长度编码中的最后16位代码单元,则该函数确定存储该代码点的多字节字符表示所需的字节数(包括任何 移位序列),并将多字节字符表示存储在第一个元素由s指向的字符数组中。 该函数最多可以写入MB_CUR_MAX个字节。

如果s是空指针,那么对于某些内部缓冲区buf,调用等同于c16rtomb(buf,u'\ 0',ps)。

如果c16是空宽字符u'\ 0',则存储空字节,之前是恢复初始转换状态所需的任何转换序列,并且转换状态参数* ps被更新以表示初始转换状态。

如果c16不是宽字符的16位表示形式的最终代码单元,则它不会写入由s指向的数组,只会更新* ps。

如果定义了宏__STDC_UTF_16__,则该函数使用的16位编码为UTF-16; 否则,它是实现定义的。 在任何情况下,此函数使用的多字节字符编码均由当前活动的C语言环境指定。

参数

s

-

指向多字节字符将被存储在其中的窄字符数组的指针

C16

-

要转换的16位宽字符

PS

-

指向解释多字节字符串时使用的转换状态对象的指针

返回值

成功时,返回写入字符数组的第一个元素由s指向的字节数(包括任何移位序列)。 这个值可能是?0 ?,例如 当处理多char16_t单元序列中的前导char16_t单元时(发生在处理UTF-16的代理对中的前导代理时)。

失败时(如果c16不是有效的16位代码单元)则返回-1,将EILSEQ存储在errno中,并使* ps处于未指定状态。

注意

在发布的C11中,与将可变宽度多字节(如UTF-8)转换为可变宽度16位(如UTF-16)编码的mbrtoc16不同,此函数只能转换单个单元的16位编码, 这意味着它不能将UTF-16转换为UTF-8,尽管这是该功能的最初意图。 C11之后的缺陷报告DR488纠正了这一问题。

注意:此示例假定应用了缺陷报告488的修复。

#include <stdio.h>
#include <locale.h>
#include <uchar.h>
#include <stdlib.h>
 
mbstate_t state;
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    char16_t in[] = u"zß水?"; // or "z\u00df\u6c34\U0001F34C"
    size_t in_sz = sizeof in / sizeof *in;
 
    printf("Processing %zu UTF-16 code units: [ ", in_sz);
    for(size_t n = 0; n < in_sz; ++n) printf("%#x ", in[n]);
    puts("]");
 
    char out[MB_CUR_MAX * in_sz];
    char *p = out;
    for(size_t n = 0; n < in_sz; ++n) {
        int rc = c16rtomb(p, in[n], &state); 
        if(rc == -1) break;
        p += rc;
    }
 
    size_t out_sz = p - out;
    printf("into %zu UTF-8 code units: [ ", out_sz);
    for(size_t x = 0; x < out_sz; ++x) printf("%#x ", +(unsigned char)out[x]);
    puts("]");
}

输出:

Processing 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ]
into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]

参考

  • C11标准(ISO / IEC 9899:2011):
    • 7.28.1.2 c16rtomb功能(p:399-400)

扩展内容

mbrtoc16(C11)

从一个窄多字节字符串(函数)生成下一个16位宽字符

| c16rtomb的C ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。