Namespaces
Variants

std:: mbtowc

From cppreference.net
定义于头文件 <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); // 重置转换状态
    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 = "z\u00df\u6c34\U0001d10b"; // 或 "zß水𝄋"
                      // 或 "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b";
    print_mb(str);
}

输出:

zß水𝄋

参见

在给定状态的情况下将下一个多字节字符转换为宽字符
(函数)
返回下一个多字节字符的字节数
(函数)
[virtual]
将字符串从 ExternT 转换为 InternT ,例如从文件读取时
( std::codecvt<InternT,ExternT,StateT> 的虚受保护成员函数)
C 文档 for mbtowc