非常教程

C参考手册

字符串 | Strings

mbrtowc

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

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

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

参数

pwc

-

指向结果宽字符将被写入的位置的指针

s

-

指向用作输入的多字节字符串的指针

n

-

限制可以检查的s中的字节数

ps

-

指向解释多字节字符串时使用的转换状态的指针

返回值

以下第一项适用:

  • 如果从s转换的字符(并且如果非null则存储在pwc中)是空字符,则返回0
  • 返回从s成功转换的多字节字符的字节数[1 ... n]
  • 如果接下来的n个字节构成一个不完整的,但到目前为止有效的多字节字符。 没有什么是写给* pwc的。此时返回(size_t)-2
  • 如果发生编码错误, 没有任何内容写入* pwc,EILSEQ的值存储在errno中,* ps的值未指定。此时返回(size_t)-1

#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):
    • 7.29.6.3.2 mbrtowc函数(p:443)
  • C99标准(ISO / IEC 9899:1999):
    • 7.24.6.3.2 mbrtowc函数(p:389)

扩展内容

mbtowc

将下一个多字节字符转换为宽字符(函数)

wcrtombwcrtomb_s(C95)(C11)

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

| mbrtowc的C ++文档 |

C

C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。