std::mbtowc
来自 cppreference.cn
定义于头文件 <cstdlib> |
||
int mbtowc( wchar_t* pwc, const char* s, std::size_t n ); |
||
将指向 s 的首字节的多字节字符转换成宽字符,如果 pwc 非空则写入 *pwc。
如果 s 是空指针,则重置全局转换状态并确定是否使用移位序列。
目录 |
[编辑] 参数
s | - | 指向多字节字符的指针 |
n | - | s 中可检查的字节数的限制 |
pwc | - | 输出宽字符的指针 |
[编辑] 返回值
如果 s 不是空指针,返回多字节字符所包含的字节数,如果 s 指向的首字节不构成有效的多字节字符则返回 -1,如果 s 指向空字符 '\0' 则返回 0。
如果 s 是空指针,重置其内部转换状态以表示初始移位状态,如果当前多字节编码不依赖于状态(不使用移位序列)则返回 0,如果当前多字节编码依赖于状态(使用移位序列)则返回非零值。
[编辑] 注意
每次对 mbtowc
的调用都会更新内部全局转换状态(类型为 std::mbstate_t 的静态对象,仅此函数可见)。如果多字节编码使用移位状态,必须小心避免回溯或多次扫描。在任何情况下,多个线程不应在没有同步的情况下调用 mbtowc
:可以使用 std::mbrtowc 代替。
[编辑] 示例
运行此代码
#include <clocale> #include <cstdlib> #include <cstring> #include <iostream> int print_mb(const char* ptr) { std::mbtowc(nullptr, 0, 0); // reset the conversion state const char* end = ptr + std::strlen(ptr); int ret{}; for (wchar_t wc; (ret = std::mbtowc(&wc, ptr, end - ptr)) > 0; ptr += ret) std::wcout << wc; std::wcout << '\n'; return ret; } int main() { std::setlocale(LC_ALL, "en_US.utf8"); // UTF-8 narrow multibyte encoding const char* str = "z\u00df\u6c34\U0001d10b"; // or "zß水𝄋" // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"; print_mb(str); }
输出
zß水𝄋
[编辑] 参阅
将下一个多字节字符转换为宽字符,给定状态 (函数) | |
返回下一个多字节字符的字节数 (函数) | |
[虚拟] |
将字符串从 ExternT 转换为 InternT ,例如从文件读取时( std::codecvt<InternT,ExternT,StateT> 的虚拟保护成员函数) |