C

wcrtomb

wcrtomb, wcrtomb_s

在头文件中定义
(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(包括任何移位序列)所需的字节数,并将多字节字符表示存储在第一个元素指向的字符数组中sMB_CUR_MAX该函数最多可以写入字节。

如果s是空指针,则该调用等同wcrtomb(buf, L'\0', ps)于某个内部缓冲区buf

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

2)与(1)相同,除此之外

如果s是空指针,则调用等同于wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps)内部变量retvalbuf(其大小大于MB_CUR_MAX

结果将返回到out参数retval

在运行时检测到以下错误并调用当前安装的约束处理函数:

  • retval或者ps是空指针。

作为所有边界检查函数,wcrtomb_s只有在被__STDC_LIB_EXT1__实现定义__STDC_WANT_LIB_EXT1__并且1在包含之前用户定义为整数常量时才能保证可用wchar.h

参数

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

返回值

1)成功时,返回写入第一个元素指向的字符数组的字节数(包括任何移位序列)s

如果失败(如果wc不是有效的宽字符),返回(size_t)-1,储存EILSEQerrno,并留下*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> void print_wide(const wchar_t* wstr) { mbstate_t state; memset(&state, 0, sizeof state char mb[MB_CUR_MAX+1]; for(;*wstr; ++wstr) { int ret = wcrtomb(mb, *wstr, &state mb[ret] = '\0'; printf("multibyte char %s is %d bytes\n", mb, ret } } int main(void) { setlocale(LC_ALL, "en_US.utf8" print_wide(L"z\u00df\u6c34\U0001F34C" // or L"zß水?" }

输出:

multibyte char z is 1 bytes multibyte char ß is 2 bytes multibyte char 水 is 3 bytes multibyte char ? is 4 bytes

参考

  • C11标准(ISO/IEC 9899:2011):

另请参阅

wctombwctomb_s(C11)将宽字符转换为其多字节表示(函数)
mbrtowc(C95)将下一个多字节字符转换为宽字符,给定状态(函数)

| 用于wcrtomb |的C ++文档