命名空间
变体
操作

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

如果 s 是空指针,则忽略 npwc 的值,调用等效于 std::mbrtowc(nullptr, "", 1, ps).

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

内容

[编辑] 参数

pwc - 指向将写入结果宽字符的位置的指针
s - 指向用作输入的多字节字符字符串的指针
n - s 中可以检查的字节数限制
ps - 指向在解释多字节字符串时使用的转换状态的指针

[编辑] 返回值

以下第一个适用的

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

[编辑] 示例

#include <clocale>
#include <cstring>
#include <cwchar>
#include <iostream>
 
void print_mb(const char* ptr)
{
    std::mbstate_t state = std::mbstate_t(); // initial state
    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 narrow multibyte encoding
    const char* str = "z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋"
                      // or "\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> 的虚拟受保护成员函数) [编辑]
C 文档 对于 mbrtowc