mbrtowc
出自 cppreference.cn
定义于头文件 <wchar.h> |
||
(C95 起) | ||
(C99 起) | ||
将窄多字节字符转换为其宽字符表示。
如果 s
不是空指针,则检查以 s
指向的字节开始的多字节字符字符串的最多 n
个字节,以确定完成下一个多字节字符所需的字节数(包括任何移位序列,并考虑当前的多字节转换状态 *ps)。如果函数确定 s
中的下一个多字节字符是完整且有效的,则将其转换为相应的宽字符,并将其存储在 *pwc 中(如果 pwc
不为空)。
如果 s
是一个空指针,则忽略 n
和 pwc
的值,并且调用等效于 mbrtowc(NULL, "", 1, ps)。
如果生成的宽字符是空字符,则存储在 *ps 中的转换状态是初始移位状态。
如果定义了环境宏 __STDC_ISO_10646__,则 wchar_t 类型的值与 Unicode 必需字符集中字符的短标识符相同(通常为 UTF-32 编码);否则,它是实现定义的。在任何情况下,此函数使用的多字节字符编码由当前活动的 C 本地环境指定。
内容 |
[编辑] 参数
pwc | - | 指向将要写入结果宽字符的位置的指针 |
s | - | 指向用作输入的多字节字符字符串的指针 |
n | - | 可以检查的 s 中的字节数的限制 |
ps | - | 指向用于解释多字节字符字符串的转换状态的指针 |
[编辑] 返回值
以下适用的第一项
- 0 如果从
s
转换的字符(并且如果非空则存储在 pwc 中)是空字符 - 成功从
s
转换的多字节字符的字节数 [1...n] - (size_t)-2 如果接下来的
n
个字节构成一个不完整的,但到目前为止有效的多字节字符。不写入任何内容到 *pwc。 - (size_t)-1 如果发生编码错误。不写入任何内容到
*pwc
,值 EILSEQ 存储在 errno 中,并且 *ps 的值未指定。
[编辑] 示例
运行此代码
#include <stdio.h> #include <locale.h> #include <string.h> #include <wchar.h> int main(void) { setlocale(LC_ALL, "en_US.utf8"); mbstate_t state; memset(&state, 0, sizeof state); char in[] = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-8 code units: [ ", in_sz); for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned char)in[n]); puts("]"); wchar_t out[in_sz]; char *p_in = in, *end = in + in_sz; wchar_t *p_out = out; int rc; while((rc = mbrtowc(p_out, p_in, end - p_in, &state)) > 0) { p_in += rc; p_out += 1; } size_t out_sz = p_out - out + 1; printf("into %zu wchar_t units: [ ", out_sz); for(size_t x = 0; x < out_sz; ++x) printf("%#x ", out[x]); puts("]"); }
输出
Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ] into 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ]