wcrtomb, wcrtomb_s
来自 cppreference.cn
定义于头文件 <wchar.h> |
||
(1) | ||
(since C95) | ||
(since C99) | ||
(2) | (since C11) | |
将一个宽字符转换为其窄多字节表示。
1) 如果
s
不是空指针,函数会确定存储 wc
的多字节字符表示所需的字节数(包括任何移位序列,并考虑当前多字节转换状态 *ps),并将多字节字符表示存储在字符数组中,该数组的第一个元素由 s
指向,并根据需要更新 *ps。此函数最多可以写入 MB_CUR_MAX 个字节。 如果
s
是一个空指针,则调用等效于 wcrtomb(buf, L'\0', ps) 对于某些内部缓冲区 buf
。 如果 wc 是空宽字符 L'\0',则存储一个空字节,其前面是恢复初始移位状态所需的任何移位序列,并且转换状态参数 *ps 将更新以表示初始移位状态。
如果定义了环境宏 __STDC_ISO_10646__,则 wchar_t 类型的值与 Unicode 必需字符集(通常为 UTF-32 编码)中字符的短标识符相同;否则,它是实现定义的。在任何情况下,此函数使用的多字节字符编码由当前活动的 C 语言环境指定。
2) 与 (1) 相同,除了
如果
s
是一个空指针,则调用等效于 wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps) 与内部变量 retval
和 buf
(其大小大于 MB_CUR_MAX) 结果在输出参数
retval
中返回 以下错误在运行时检测到,并调用当前安装的 约束处理函数
-
retval
或ps
是空指针。 -
ssz
为零或大于 RSIZE_MAX(除非s
为空) -
ssz
小于将要写入的字节数(除非s
为空) -
s
是一个空指针,但ssz
不是零
-
- 与所有边界检查函数一样,只有当实现定义了 __STDC_LIB_EXT1__ 并且用户在包含 <wchar.h> 之前将 __STDC_WANT_LIB_EXT1__ 定义为整数常量 1 时,才能保证
wcrtomb_s
可用。
内容 |
[编辑] 参数
s | - | 指向窄字符数组的指针,多字节字符将存储在该数组中 |
wc | - | 要转换的宽字符 |
ps | - | 指向转换状态对象的指针,用于解释多字节字符串 |
ssz | - | 要写入的最大字节数(缓冲区 s 的大小) |
retval | - | 指向输出参数的指针,结果(多字节字符串中的字节数,包括任何移位序列)将存储在该参数中 |
[编辑] 返回值
1) 成功时,返回写入到字符数组的字节数(包括任何移位序列),该数组的第一个元素由
s
指向。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> int main(void) { setlocale(LC_ALL, "en_US.utf8"); mbstate_t state; memset(&state, 0, sizeof state); wchar_t in[] = L"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu wchar_t units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned int)in[n]); puts("]"); char out[MB_CUR_MAX * in_sz]; char *p = out; for(size_t n = 0; n < in_sz; ++n) { int rc = wcrtomb(p, in[n], &state); if(rc == -1) break; p += rc; } size_t out_sz = p - out; printf("into %zu UTF-8 code units: [ ", out_sz); for(size_t x = 0; x < out_sz; ++x) printf("%#x ", +(unsigned char)out[x]); puts("]"); }
输出
Processing 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ] into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]