C++ 参考手册

定义于头文件 <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 转换每个多字节字符。若满足下列条件则转换终止:

  • 转换并存储了多字节空字符。设置 *srcNULL 并令 *ps 表示初始迁移状态。
  • 遇到任何非法多字节字符(按照当前 C 本地环境)。设置 *src 指向首个未转换的多字节字符的起始。
  • 将存储的下个宽字符将超出 len 。设置 *src 指向首个未转换的多字节字符的起始。若 dst==NULL 则不检查此条件。

参数

dst - 指向将存储结果的宽字符数组的指针
src - 指向空终止多字节字符串首元素的指针
len - dst 所指向的字符数组中可用的宽字符数
ps - 指向转换状态对象的指针

返回值

成功时返回写入字符数组的宽字符数,排除终止的 L'\0' 。若 dst==NULL ,则返回给定无限定长度则本会写入的宽字符数。

转换错误时(若遇到非法多字节字符)返回 static_cast<std::size_t>(-1) ,存储 EILSEQerrno ,并令 *ps 留在未指定状态。

注意

此函数移动 src 指针指向被转换的多字节字符串结尾。若 dst==NULL 则这不发生。

示例

#include <iostream>
#include <vector>
#include <clocale>
#include <cwchar>
 
void print_as_wide(const char* mbstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::mbsrtowcs(NULL, &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 = u8"z\u00df\u6c34\U0001f34c"; // 或 u8"zß水????"
    print_as_wide(mbstr);
}

输出:

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

参阅

给定状态,转换下个多字节字符为宽字符
(函数)
给定状态,转换宽字符串为窄多字节字符串
(函数)
[虚]
从 externT 转换字符串为 internT ,如在从文件读取时
(std::codecvt<InternT,ExternT,State> 的虚受保护成员函数)