std::mbtowc
来自 cppreference.com
定义在头文件 <cstdlib> 中 |
||
int mbtowc( wchar_t* pwc, const char* s, std::size_t n ); |
||
将一个多字节字符(其首字节由 s 指向)转换为一个宽字符,如果 pwc 不是空指针,则写入 *pwc。
如果 s 是一个空指针,则重置全局转换状态,并确定是否使用移位序列。
内容 |
[编辑] 参数
s | - | 指向多字节字符的指针 |
n | - | s 中可检查的字节数限制 |
pwc | - | 指向用于输出的宽字符的指针 |
[编辑] 返回值
如果 s 不是空指针,则返回多字节字符中包含的字节数,或 -1 如果 s 指向的第一个字节不构成有效的多字节字符,或 0 如果 s 指向空字符 '\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> 的虚拟受保护成员函数) |
C 文档 针对 mbtowc
|