std::mbrtowc
来自 cppreference.com
定义在头文件 <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 𝄋
[编辑] 另请参见
将下一个多字节字符转换为宽字符 (函数) | |
将宽字符转换为其多字节表示形式,给定状态 (函数) | |
[虚拟] |
将字符串从 ExternT 转换为 InternT ,例如从文件读取时( std::codecvt<InternT,ExternT,StateT> 的虚拟受保护成员函数) |
C 文档 对于 mbrtowc
|