命名空间
变体
操作

std::wctomb

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

将宽字符 wc 转换为多字节编码,并将其(包括任何移位序列)存储在 char 数组中,该数组的首个元素由 s 指向。存储的字符数不超过 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 文档 关于 wctomb