命名空间
变体
操作

std::mbrtowc

来自 cppreference.cn
< 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(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