mbrtowc
来自 cppreference.com
定义在头文件 <wchar.h> 中 |
||
(自 C95 起) | ||
(自 C99 起) | ||
将一个窄多字节字符转换为其宽字符表示形式。
如果 s
不是空指针,则检查最多 n
个字节的多字节字符字符串,从 s
指向的字节开始,以确定完成下一个多字节字符所需的字节数(包括任何移位序列,并考虑到当前的多字节转换状态 *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 ]