命名空间
变体
操作

std::wctomb

来自 cppreference.com
< cpp‎ | string‎ | multibyte
定义在头文件 <cstdlib>
int wctomb( char* s, wchar_t wc );

将宽字符 wc 转换为多字节编码,并将它(包括任何移位序列)存储在第一个元素由 s 指向的 char 数组中。存储的字符不超过 MB_CUR_MAX 个。转换受当前区域设置的 LC_CTYPE 类别影响。

如果 wc 是空字符,则将空字节写入 s,前面是恢复初始移位状态所需的任何移位序列。

如果 s 是空指针,则重置全局转换状态并确定是否使用移位序列。

内容

[编辑] 参数

s - 指向输出字符数组的指针
wc - 要转换的宽字符

[编辑] 返回值

如果 s 不是空指针,则返回 wc 的多字节表示形式中包含的字节数,或者如果 wc 不是有效字符,则返回 -1

如果 s 是空指针,则将其内部转换状态重置为表示初始移位状态,如果当前多字节编码不是状态相关的(不使用移位序列),则返回 0,或者如果当前多字节编码是状态相关的(使用移位序列),则返回非零值。

[编辑] 备注

每次调用 wctomb 都会更新内部全局转换状态(一个类型为 std::mbstate_t 的静态对象,仅此函数知道)。如果多字节编码使用移位状态,则此函数不是可重入的。无论如何,多个线程不应在没有同步的情况下调用 wctomb:可以改用 std::wcrtomb

[编辑] 示例

#include <clocale>
#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>
 
void print_wide(const std::wstring& wstr)
{
    bool shifts = std::wctomb(nullptr, 0); // reset the conversion state
    std::cout << "shift sequences are " << (shifts ? "" : "not" )
              << " used\n" << std::uppercase << std::setfill('0');
    for (const wchar_t wc : wstr)
    {
        std::string mb(MB_CUR_MAX, '\0');
        const int ret = std::wctomb(&mb[0], wc);
        const char* s = ret > 1 ? "s" : "";
        std::cout << "multibyte char '" << mb << "' is " << ret
                  << " byte" << s << ": [" << std::hex;
        for (int i{0}; i != ret; ++i)
        {
            const int c = 0xFF & mb[i];
            std::cout << (i ? " " : "") << std::setw(2) << c;
        }
        std::cout << "]\n" << std::dec;
    }
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    // UTF-8 narrow multibyte encoding
    std::wstring wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋"
    print_wide(wstr);
}

输出

shift sequences are not used
multibyte char 'z' is 1 byte: [7A]
multibyte char 'ß' is 2 bytes: [C3 9F]
multibyte char '水' is 3 bytes: [E6 B0 B4]
multibyte char '𝄋' is 4 bytes: [F0 9D 84 8B]

[编辑] 另请参见

将下一个多字节字符转换为宽字符
(函数) [编辑]
将宽字符转换为其多字节表示形式,给定状态
(函数) [编辑]
[虚拟]
将字符串从 InternT 转换为 ExternT,例如写入文件时
(std::codecvt<InternT,ExternT,StateT> 的虚拟受保护成员函数) [编辑]
C 文档 for wctomb