C++ 参考手册

定义于头文件 <cwchar>
std::size_t wcrtomb( char* s, wchar_t wc, std::mbstate_t* ps );

转换宽字符为其窄多字节表示。

s 不是空指针,则函数检测存储 wc 的多字节字符表示所需的字节数(包含任何迁移序列,并考虑当前多字节转换状态 *ps ,并存储多字节字符表示于首元素为 s 所指向的字符数组,按需更新 *ps 。此函数至多能写入 MB_CUR_MAX 字节。

s 为空指针,则调用等价于对某内部缓冲区 bufwcrtomb(buf, L'\0', ps)

若 wc 是空宽字符 L'\0' ,则存储空字节,前接任何恢复到初始迁移状态所需的迁移序列,并更新转换状态参数 *ps 以表示初始迁移状态。

参数

s - 指向窄字符数组的指针,其中将存储多字节字符串
wc - 要转换的宽字符
ps - 指向转译多字节字符串时所用的转换状态对象的指针

返回值

成功时,返回写入首元素为 s 所指向的字符数组的字节数(包含任何迁移序列)。

失败时(若 wc 不是合法宽字符),返回 static_cast<std::size_t>(-1) ,存储 EILSEQerrno ,并使 *ps 留在未指定状态。

示例

#include <iostream>
#include <clocale>
#include <string>
#include <cwchar>
 
void print_wide(const std::wstring& wstr)
{
    std::mbstate_t state {};
    for(wchar_t wc : wstr) {
        std::string mb(MB_CUR_MAX, '\0');
        std::size_t ret = std::wcrtomb(&mb[0], wc, &state);
        std::cout << "multibyte char " << mb << " is " << ret << " bytes\n";
    }
}
 
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::wstring wstr = L"z\u00df\u6c34\U0001f34c"; // 或 L"zß水????"
    print_wide(wstr);
}

输出:

multibyte char z is 1 bytes
multibyte char ß is 2 bytes
multibyte char 水 is 3 bytes
multibyte char ???? is 4 bytes

参阅

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