mbrtowc
来自cppreference.com
在标头 <wchar.h> 定义
|
||
(C95 起) | ||
(C99 起) | ||
转换窄多字节字符为宽字符表示。
若 s
不是空指针,则从 s
所指向的字节起,审查多字节字符串的至多 n
个字节,以确定完成下个多字节字符(包含任何迁移序列)的字节数。若该函数确定 s
的下个多字节字符完整且合法,则将它转换为对应的宽字符,并存储之于 *pwc(若 pwc
非空)。
若 s
是空指针,则忽略 n
和 pwc
的值,调用等价于 mbrtowc(NULL, "", 1, ps)。
若产生的宽字符是空字符,则存储于 *ps 的转换状态为初始迁移状态。
参数
pwc | - | 指向要写入结果宽字符位置的指针 |
s | - | 指向用作输入的多字节字符串的指针 |
n | - | s 中能被检验的字节数限制
|
ps | - | 指向转译多字节字符串时的转换状态的指针 |
返回值
下列首个适用者:
- 若自
s
转换的字符为空字符,则为 0(且若 pwc 非空存储于其中) - 成功从
s
转换的多字节字符 [1...n] 的字节数 - 若接下来的
n
字节组成不完整,但该部分合法的宽字符,则为 (size_t)-2。不写入 *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"; // 或 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 ]
引用
- C11 标准(ISO/IEC 9899:2011):
- 7.29.6.3.2 The mbrtowc function (第 443 页)
- C99 标准(ISO/IEC 9899:1999):
- 7.24.6.3.2 The mbrtowc function (第 389 页)
参阅
将下一个多字节字符转换成宽字符 (函数) | |
(C95)(C11) |
给定状态,将宽字符转换成其多字节表示 (函数) |