mbrtowc
来自 cppreference.cn
在头文件 <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 ]