C

mbrtowc

mbrtowc

在头文件中定义
size_t mbrtowc(wchar_t * pwc,const char * s,size_t n,mbstate_t * ps);(自C95以来)
size_t mbrtowc(wchar_t * restrict pwc,const char * restrict s,size_t n,mbstate_t * restrict ps);(自C99以来)

将窄多字节字符转换为宽字符表示形式。

如果s不是空指针,则检查多字节字符串的至多n个字节,从s指向的字节开始,以确定完成下一个多字节字符(包括任何移位序列)所需的字节数。 如果函数确定s中的下一个多字节字符是完整且有效的,则将其转换为相应的宽字符并将其存储在* pwc中(如果pwc不为null)。

如果s是空指针,则忽略n和pwc的值,并且调用等同于mbrtowc(NULL,“”,1,ps)。

如果生成的宽字符为空字符,则* ps中存储的转换状态为初始转换状态。

参数

pwc-指向结果宽字符将被写入的位置的指针
s-指向用作输入的多字节字符串的指针
n-限制可以检查的s中的字节数
ps-指向解释多字节字符串时使用的转换状态的指针

返回值

以下第一项适用:

  • 如果从s转换的字符(并且如果非null则存储在pwc中)是空字符,则返回0

#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 ]

参考

  • C11标准(ISO / IEC 9899:2011):

扩展内容

mbtowc将下一个多字节字符转换为宽字符(函数)
wcrtombwcrtomb_s(C95)(C11)将宽字符转换为其多字节表示,给定状态(函数)

| mbrtowc的C ++文档 |