命名空间
变体
操作

wcrtomb, wcrtomb_s

来自 cppreference.com
< c‎ | string‎ | multibyte
在头文件 <wchar.h> 中定义
(1)
size_t wcrtomb( char *s, wchar_t wc, mbstate_t *ps);
(自 C95)
size_t wcrtomb( char *restrict s, wchar_t wc, mbstate_t *restrict ps);
(自 C99)
errno_t wcrtomb_s(size_t *restrict retval, char *restrict s, rsize_t ssz,
                  wchar_t wc, mbstate_t *restrict ps);
(2) (自 C11)

将宽字符转换为其窄多字节表示形式。

1) 如果 s 不是空指针,则函数确定存储 wc 的多字节字符表示形式所需的字节数(包括任何移位序列,并考虑当前的多字节转换状态 *ps),并将多字节字符表示形式存储在第一个元素由 s 指向的字符数组中,根据需要更新 *ps。此函数最多可以写入 MB_CUR_MAX 个字节。
如果 s 是空指针,则调用等效于 wcrtomb(buf, L'\0', ps),其中 buf 是某个内部缓冲区。
如果 wc 是空宽字符 L'\0',则存储一个空字节,前面是恢复初始移位状态所需的任何移位序列,并且转换状态参数 *ps 被更新以表示初始移位状态。
如果环境宏 __STDC_ISO_10646__ 被定义,则类型 wchar_t 的值与 Unicode 必需集中字符的短标识符相同(通常为 UTF-32 编码);否则,它是实现定义的。无论哪种情况,此函数使用的多字节字符编码都由当前活动的 C 本地化指定。
2)(1) 相同,除了
如果 s 是空指针,则调用等效于 wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps),其中 retvalbuf 是内部变量(其大小大于 MB_CUR_MAX
结果在输出参数 retval 中返回
以下错误在运行时被检测到,并调用当前已安装的 约束处理程序 函数
  • retvalps 是空指针。
  • ssz 为零或大于 RSIZE_MAX(除非 s 为空)
  • ssz 小于将要写入的字节数(除非 s 为空)
  • s 是空指针,但 ssz 不为零
与所有边界检查函数一样,wcrtomb_s 仅在实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <wchar.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时才保证可用。

内容

[编辑] 参数

s - 指向将存储多字节字符的窄字符数组的指针
wc - 要转换的宽字符
ps - 指向解释多字节字符串时使用的转换状态对象的指针
ssz - 要写入的最大字节数(缓冲区 s 的大小)
retval - 指向输出参数的指针,结果(多字节字符串中的字节数,包括任何移位序列)将存储在该指针中

[编辑] 返回值

1) 成功时,返回写入第一个元素由 s 指向的字符数组的字节数(包括任何移位序列)。
失败时(如果 wc 不是有效的宽字符),返回 (size_t)-1,将 EILSEQ 存储在 errno 中,并将 *ps 留在未指定状态。
2) 成功时返回零,失败时返回非零,在这种情况下,s[0] 设置为 '\0'(除非 s 为空或 ssz 为零或大于 RSIZE_MAX)并且 *retval 设置为 (size_t)-1(除非 retval 为空)

[编辑] 示例

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    mbstate_t state;
    memset(&state, 0, sizeof state);
    wchar_t in[] = L"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    size_t in_sz = sizeof in / sizeof *in;
 
    printf("Processing %zu wchar_t units: [ ", in_sz);
    for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned int)in[n]);
    puts("]");
 
    char out[MB_CUR_MAX * in_sz];
    char *p = out;
    for(size_t n = 0; n < in_sz; ++n) {
        int rc = wcrtomb(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 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]
into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]

[编辑] 参考

  • C11 标准(ISO/IEC 9899:2011)
  • 7.29.6.3.3 wcrtomb 函数(p: 444)
  • K.3.9.3.1.1 wcrtomb_s 函数(p: 647-648)
  • C99 标准(ISO/IEC 9899:1999)
  • 7.24.6.3.3 wcrtomb 函数(p: 390)

[编辑] 另请参阅

将宽字符转换为其多字节表示形式
(函数) [编辑]
将下一个多字节字符转换为宽字符,给出状态
(函数) [编辑]
C++ 文档 for wcrtomb