wctomb, wctomb_s
来自 cppreference.com
在头文件 <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。转换受当前区域设置的 LC_CTYPE 类别影响。 如果
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) { const char* dep = wctomb(NULL, wc) ? "Yes" : "No"; printf("State-dependent encoding? %s.\n", dep); 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("%s%#2x", idx ? " " : "", (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? No. wide char 'A' -> multibyte char [0x41] State-dependent encoding? No. wide char 'ß' -> multibyte char [0xc3 0x9f] State-dependent encoding? No. wide char '𝄋' -> multibyte char [0xf0 0x9d 0x84 0x8b]
[编辑] 参考
- C17 标准 (ISO/IEC 9899:2018)
- 7.22.7.3 wctomb 函数 (p: 261)
- K.3.6.4.1 wctomb_s 函数 (p: 443)
- C11 标准 (ISO/IEC 9899:2011)
- 7.22.7.3 wctomb 函数 (p: 358-359)
- K.3.6.4.1 wctomb_s 函数 (p: 610-611)
- C99 标准 (ISO/IEC 9899:1999)
- 7.20.7.3 wctomb 函数 (p: 322-323)
- C89/C90 标准 (ISO/IEC 9899:1990)
- 4.10.7.3 wctomb 函数
[编辑] 另请参阅
将下一个多字节字符转换为宽字符 (函数) | |
(C95)(C11) |
将宽字符转换为其多字节表示形式,给出状态 (函数) |
C++ 文档 for wctomb
|