C++ 参考手册

定义于头文件 <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 <iostream>
#include <clocale>
#include <cstring>
#include <cstdlib>
 
int print_mb(const char* ptr)
{
    std::mbtowc(NULL, 0, 0); // 重置转换状态
    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 窄多字节编码
    const char* str = u8"z\u00df\u6c34\U0001d10b"; // 或 u8"zß水????"
                      // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

输出:

zß水????

参阅

给定状态,转换下个多字节字符为宽字符
(函数)
返回下一个多字节字符中的字节数
(函数)
[虚]
从 externT 转换字符串为 internT ,如在从文件读取时
(std::codecvt<InternT,ExternT,State> 的虚受保护成员函数)