mbrtowc

来自cppreference.com
< c‎ | string‎ | multibyte
定义于头文件 <wchar.h>
size_t mbrtowc( wchar_t* pwc, const char* s, size_t n, mbstate_t* ps );
(C95 起)

转换窄多字符为宽字符。

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)

[编辑] 参阅

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