C 参考手册
- C 语言
- C 关键词
- 预处理器
- C 标准库头文件
- 类型支持
- 程序支持工具
- 变参数函数
- 错误处理
- 动态内存管理
- 日期和时间工具
- 字符串库
- 空终止字节字符串
- 空终止多字节字符串
- mbsinit
- mbtowc
- btowc
- mbrtowc
- mbstowcs, mbstowcs_s
- mbsrtowcs, mbsrtowcs_s
- mbrtoc16
- c16rtomb
- c32rtomb
- mbrtoc32
- mblen
- wctomb, wctomb_s
- wcstombs, wcstombs_s
- wctob
- wcrtomb, wcrtomb_s
- wcsrtombs, wcsrtombs_s
- mbrlen
- mbstate_t
- char16_t
- char32_t
- 空终止宽字符串
- 算法
- 数值
- 文件输入/输出
- 本地化支持
- 原子操作库
- 线程支持库
- 实验性 C 标准库
- 有用的资源
- 符号索引
- 注释
wctomb, wctomb_s
定义于头文件 <stdlib.h>
|
||
int wctomb( char *s, wchar_t wc ); |
(1) | |
errno_t wctomb_s(int *restrict status, char *restrict s, rsize_t ssz, wchar_t wc); |
(2) | (C11 起) |
1) 转换宽字符
wc
为多字节编码,并存储之(含迁移状态)于 s
指向其首元素的字符数组。存储字节数不多于 MB_CUR_MAX 。 若
wc
是空字符,则将空字符写入 s
,之前可以有需要恢复初始迁移状态的任何迁移状态。 若
s
是空指针,则此函数重设全局转换状态并确定是否使用迁移序列。2) 同 (1) ,除了结果被返回到输出参数
status
,在运行时检测下列错误,并调用当前安装的制约处理函数:
-
ssz
小于会被写入的字节数(除非s
为空) -
ssz
大于 RSIZE_MAX (除非s
为空) -
s
为空指针但ssz
非零
-
- 同所有边界检查函数,
wctomb_s
仅若实现定义了 __STDC_LIB_EXT1__ ,且用户在包含<stdlib.h>
前定义 __STDC_WANT_LIB_EXT1__ 为整数常量 1 才保证可用。
注意
每次对 wctomb
的调用更新全局转换状态( mbstate_t 类型的静态对象,只为此函数所知)。若多字节编码使用迁移状态,则此函数不可重入。任何情况下,多个线程不应调用 wctomb
而不同步:可使用 wcrtomb 或 wctomb_s
代替。
不同于大多数边界检查函数, wctomb_s
不以空字符终止其输出,因为它被设计以用于逐字节处理的循环。
参数
s | - | 指向输出用字符数组的指针 |
wc | - | 要转换的宽字符 |
ssz | - | 要写入 s 的最大字节数(数组 s 的大小)
|
status | - | 指向结果(多字节序列长度或迁移序列状态)存储位置的输出参数的指针 |
返回值
1) 若
s
非空指针,则返回 wc
的多字节表示所含的字节数,或者若 wc
非合法字符则为 -1 。 若
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 standard (ISO/IEC 9899:2011):
- 7.22.7.3 The wctomb function (p: 358-359)
- K.3.6.4.1 The wctomb_s function (p: 610-611)
- C99 standard (ISO/IEC 9899:1999):
- 7.20.7.3 The wctomb function (p: 322-323)
- C89/C90 standard (ISO/IEC 9899:1990):
- 4.10.7.3 The wctomb function
参阅
将下一个多字节字符转换成宽字符 (函数) | |
(C95)(C11) |
给定状态,将宽字符转换成其多字节表示 (函数) |