命名空间
变体
操作

std::mbtowc

来自 cppreference.com
< cpp‎ | string‎ | multibyte
定义在头文件 <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