wctomb_s
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 ++文档