mbrtowc

来自cppreference.com
< c‎ | string‎ | multibyte
在标头 <wchar.h> 定义
size_t mbrtowc(wchar_t* pwc, constchar* s, size_t n, mbstate_t* ps );
(C95 起)
size_t mbrtowc(wchar_t*restrict pwc, constchar*restrict s, size_t n,
                mbstate_t*restrict ps );
(C99 起)

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

s 不是空指针,则从 s 所指向的字节起,审查多字节字符串的至多 n 个字节,以确定完成下个多字节字符(包含任何迁移序列)的字节数。若该函数确定 s 的下个多字节字符完整且合法,则将它转换为对应的宽字符,并存储之于 *pwc(若 pwc 非空)。

s 是空指针,则忽略 npwc 的值,调用等价于 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,存储值 EILSEQerrno,并且置 *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("%zu 个 UTF-8 码元:[ ", in_sz);for(size_t n =0; n < in_sz;++n)printf("%#x ", (unsignedchar)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("处理成 %zu 个 wchar_t 字元:[ ", out_sz);for(size_t x =0; x < out_sz;++x)printf("%#x ", out[x]);puts("]");}

输出:

11 个 UTF-8 码元:[ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ] 处理成 5 个 wchar_t 字元:[ 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 页)

[编辑]参阅

转换下一个多字节字符为宽字符
(函数)[编辑]
给定状态,转换宽字符成其多字节表示
(函数)[编辑]
mbrtowc 的 C++ 文档
close