std::mbrtowc
来自 cppreference.cn
< cpp | string | multibyte (多字节)
在头文件 <cwchar> 中定义 |
||
std::size_t mbrtowc( wchar_t* pwc, const char* s, |
||
将窄多字节字符转换为宽字符。
如果 s 不是空指针,则检查多字节字符字符串的最多 n 个字节,从 s 指向的字节开始,以确定完成下一个多字节字符所需的字节数(包括任何移位序列)。如果函数确定 s 中的下一个多字节字符是完整且有效的,则将其转换为相应的宽字符并存储在 *pwc 中(如果 pwc 不是空)。
如果 s 是空指针,则忽略 n 和 pwc 的值,并且调用等效于 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 𝄋
[编辑] 参阅
将下一个多字节字符转换为宽字符 (函数) | |
将宽字符转换为其多字节表示,给定状态 (函数) | |
[virtual] (虚函数) |
将字符串从 ExternT 转换为 InternT ,例如从文件读取时( std::codecvt<InternT,ExternT,StateT> 的虚保护成员函数) |
C 文档 关于 mbrtowc
|