C

wctomb

wctomb, wctomb_s

在头文件中定义
int wctomb(char * s,wchar_t wc);(1)
errno_t wctomb_s(int *限制状态,char *限制s,rsize_t ssz,wchar_t wc);(2)(自C11以来)

1)将宽字符转换wc为多字节编码并将其存储在第一个元素指向的char数组中(包括任何移位序列)s。不超过MB_CUR_MAX字符存储。

如果wc是空字符,则写入空字节s,之前是恢复初始移位状态所需的任何移位序列。

如果s是空指针,则此函数会重置全局转换状态并确定是否使用移位序列。

2)与(1)相同,除了在out参数中返回结果status并在运行时检测到以下错误并调用当前安装的约束处理函数:

  • ssz小于将被写入的字节数(除非s为空)

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

注意

每次调用都会wctomb更新内部全局转换状态(类型的静态对象mbstate_t,只有该函数已知)。如果多字节编码使用移位状态,则此功能不可重入。在任何情况下,多个线程都不应该在wctomb没有同步的情况下调用:wcrtomb或者wctomb_s可以用来代替。

与大多数边界检查函数不同,wctomb_s它不会空结束它的输出,因为它被设计用于逐字符处理字符串的循环中。

参数

s-指向字符数组的输出指针
wc-宽字符转换
ssz-写入s的最大字节数(数组的大小)
status-指向将存储结果(多字节序列长度或移位序列状态)的out参数的指针

返回值

1)如果s不是空指针,则返回多字节表示中包含的字节数,wc或者-1如果wc不是有效字符。

如果s是空指针,则重置其内部转换状态以表示初始移位状态,​0​如果当前多字节编码不是状态相关(不使用移位序列),则返回表示状态,如果当前多字节编码状态不变,则返回非零值; (使用移位序列)。

2)成功为零,在这种情况下,多字节表示wc被存储在其中,s并且其长度被存储*status,或者如果s为空,则将转换序列状态存储在status)中。编码错误或运行时约束违规(在这种情况下(size_t)-1存储在其中)时非零*status。存储的值*status永远不会超过MB_CUR_MAX

示例

#include <stdio.h> #include <stdlib.h> #include <locale.h> void demo(wchar_t wc) { printf("State-dependent encoding? %d\n", wctomb(NULL, wc) char mb[MB_CUR_MAX]; int len = wctomb(mb,wc printf("wide char '%lc' -> multibyte char '", wc for (int idx = 0; idx < len; ++idx) printf("%#2x ", (unsigned char)mb[idx] printf("'\n" } int main(void) { setlocale(LC_ALL, "en_US.utf8" printf("MB_CUR_MAX = %zu\n", MB_CUR_MAX demo(L'A' demo(L'\u00df' demo(L'\U0001d10b' }

可能的输出:

MB_CUR_MAX = 6 State-dependent encoding? 0 wide char 'A' -> multibyte char '0x41 ' State-dependent encoding? 0 wide char 'ß' -> multibyte char '0xc3 0x9f ' State-dependent encoding? 0 wide char '?' -> multibyte char '0xf0 0x9d 0x84 0x8b '

参考

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

另请参阅

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

| 用于wctomb |的C ++文档