std::mbsrtowcs
来自 cppreference.cn
| 在头文件 <cwchar> 中定义 |
||
| std::size_t mbsrtowcs( wchar_t* dst, const char** src, |
||
将从 *src 指向的数组首元素开始、以 *ps 描述的转换状态开始的多字节字符空终止序列,转换为宽字符表示。如果 dst 不为 null,则转换后的字符存储在 dst 指向的 wchar_t 数组的连续元素中。写入目标数组的宽字符不超过 len 个。
每个多字节字符都像通过调用 std::mbrtowc 转换一样。如果出现以下情况,转换将停止:
- 多字节空字符已转换并存储。src 被设置为空指针,而
*ps表示初始移位状态。 - 遇到无效的多字节字符(根据当前 C 语言环境)。src 被设置为指向第一个未转换多字节字符的开头。
- 要存储的下一个宽字符将超过 len。src 被设置为指向第一个未转换多字节字符的开头。如果 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
[编辑] 另请参阅
| 将下一个多字节字符转换为宽字符,给定状态 (函数) | |
| 将宽字符串转换为窄多字节字符字符串,给定状态 (函数) | |
| [virtual] |
将字符串从 ExternT 转换为 InternT,例如从文件读取时( std::codecvt<InternT,ExternT,StateT> 的虚保护成员函数) |
| C 文档 针对 mbsrtowcs
| |