命名空间
变体
操作

std::mbsrtowcs

来自 cppreference.com
< cpp‎ | string‎ | multibyte
定义在头文件 <cwchar>
std::size_t mbsrtowcs( wchar_t* dst,

                       const char** src,
                       std::size_t len,

                       std::mbstate_t* ps );

将以空字符结尾的多字节字符序列(从由 *ps 描述的转换状态开始)从第一个元素指向的数组(由 *src 指向)转换为其宽字符表示形式。如果 dst 不为空,则转换后的字符将存储在由 dst 指向的 wchar_t 数组的连续元素中。最多将 len 个宽字符写入目标数组。

每个多字节字符的转换就像调用 std::mbrtowc 一样。转换在以下情况下停止:

  • 已转换并存储多字节空字符。 src 设置为空指针,*ps 表示初始移位状态。
  • 遇到无效的多字节字符(根据当前的 C 本地化)。 src 设置为指向第一个未转换的多字节字符的开头。
  • 要存储的下一个宽字符将超过 lensrc 设置为指向第一个未转换的多字节字符的开头。如果 dst 是空指针,则不检查此条件。

内容

[编辑] 参数

dst - 指向将存储结果的宽字符数组的指针
src - 指向指向以空字符结尾的多字节字符串的第一个元素的指针的指针
len - 由 dst 指向的数组中可用的宽字符数
ps - 指向转换状态对象的指针

[编辑] 返回值

成功时,返回写入字符数组的宽字符数(不包括终止符 L'\0')。如果 dst 是空指针,则返回在长度不受限制的情况下将写入的宽字符数。

转换错误时(如果遇到无效的多字节字符),返回 static_cast<std::size_t>(-1),将 EILSEQ 存储在 errno 中,并将 *ps 留在未指定的状态。

[编辑] 注意事项

此函数将 src 指针移动到已转换多字节字符串的末尾。如果 dst 是空指针,则不会发生这种情况。

[编辑] 示例

#include <clocale>
#include <cwchar>
#include <iostream>
#include <vector>
 
void print_as_wide(const char* mbstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state);
    std::vector<wchar_t> wstr(len);
    std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state);
    std::wcout << "Wide string: " << &wstr[0] << '\n'
               << "The length, including '\\0': " << wstr.size() << '\n';
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = "z\u00df\u6c34\U0001f34c"; // or u8"zß水🍌"
    print_as_wide(mbstr);
}

输出

Wide string: zß水🍌
The length, including '\0': 5

[编辑] 另请参见

将下一个多字节字符转换为宽字符,并给出状态
(函数) [编辑]
将宽字符串转换为窄多字节字符字符串,并给出状态
(函数) [编辑]
[虚拟]
将字符串从 ExternT 转换为 InternT,例如从文件读取时
(std::codecvt<InternT,ExternT,StateT> 的虚拟受保护成员函数) [编辑]
C 文档 for mbsrtowcs