mbrtowc

来自cppreference.com
< c‎ | string‎ | multibyte
在标头 <wchar.h> 定义
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 不是空指针,则从 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("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 页)

参阅

将下一个多字节字符转换成宽字符
(函数)
给定状态,将宽字符转换成其多字节表示
(函数)