std::mbrtowc

来自cppreference.com
< cpp‎ | string‎ | multibyte
在标头 <cwchar> 定义
std::size_t mbrtowc( wchar_t* pwc,

                     const char* s,
                     std::size_t n,

                     std::mbstate_t* ps );

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

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

s 是空指针,则忽略 npwc 的值,而调用等价于 std::mbrtowc(NULL, "", 1, ps)

若产生的宽字符是空字符,则存储于 *ps 的转换状态为初始迁移状态。

参数

pwc - 指向要写入结果宽字符位置的指针
s - 指向用作输入的多字节字符串的指针
n - s 中能被检验的字节数限制
ps - 指向转译多字节字符串时的转换状态的指针

返回值

下列首个可应用者:

  • 若转换自 s 的字符为空字符,则为 0 (若 pwc 非空则存储于 *pwc
  • 成功地 s 从转换的多字节字符 [1...n] 的字节数
  • 若接下来的 n 字节组成不完整,但该部分合法的宽字符,则为 static_cast<std::size_t>(-2) 。不写入 *pwc
  • 若出现编码错误则为 static_cast<std::size_t>(-1) 。不写入 *pwc ,存储值 EILSEQerrno ,并且置 *ps 的值为未指定。

示例

#include <iostream>
#include <clocale>
#include <cstring>
#include <cwchar>
 
void print_mb(const char* ptr)
{
    std::mbstate_t state = std::mbstate_t(); // 初始状态
    const char* end = ptr + std::strlen(ptr);
    int len;
    wchar_t wc;
    while((len = std::mbrtowc(&wc, ptr, end-ptr, &state)) > 0) {
        std::wcout << "Next " << len << " bytes are the character " << wc << '\n';
        ptr += len;
    }
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 窄多字节编码
    const char* str = u8"z\u00df\u6c34\U0001d10b"; // 或 u8"zß水𝄋"
                      // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

输出:

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 𝄋

参阅

将下一个多字节字符转换成宽字符
(函数)
给定状态,转换宽字符到其多字节表示
(函数)
[虚]
将字符串从 ExternT 转换到 InternT,例如在从文件读取时
(std::codecvt<InternT,ExternT,StateT> 的虚受保护成员函数)