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> 的虚拟保护成员函数) |
C 语言文档,关于 mbtowc
|