C 参考手册

定义于头文件 <wchar.h>
size_t mbrtowc( wchar_t* pwc, const char* s, size_t n, mbstate_t* ps );
(C95 起)
(C99 前)
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>
 
// 打印多字节字符串到宽面向的 stdout
// 等价于 wprintf(L"%s\n", ptr);
void print_mb(const char* ptr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    const char* end = ptr + strlen(ptr);
    int len;
    wchar_t wc;
    while((len = mbrtowc(&wc, ptr, end-ptr, &state)) > 0) {
        wprintf(L"Next %d bytes are the character %lc \n", len, wc);
        ptr += len;
    }
}
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 窄多字符编码
    print_mb(u8"z\u00df\u6c34\U0001F34C"); // 或 u8"zß水????"
}

输出:

Next 1 bytes are the character z
Next 2 bytes are the character ß
Next 3 bytes are the character 水
Next 4 bytes are the character ????

引用

  • C11 standard (ISO/IEC 9899:2011):
  • 7.29.6.3.2 The mbrtowc function (p: 443)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.24.6.3.2 The mbrtowc function (p: 389)

参阅

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