Namespaces
Variants

std:: wcrtomb

From cppreference.net
定義済みヘッダー <cwchar>
std:: size_t wcrtomb ( char * s, wchar_t wc, std:: mbstate_t * ps ) ;

ワイド文字をそのナローマルチバイト表現に変換します。

s が null ポインタでない場合、この関数は wc のマルチバイト文字表現を格納するために必要なバイト数(シフトシーケンスを含み、現在のマルチバイト変換状態 * ps を考慮して)を決定し、マルチバイト文字表現を s が指す先頭要素の文字配列に格納し、必要に応じて * ps を更新します。この関数によって書き込まれるバイト数は最大で MB_CUR_MAX です。

s が null ポインタの場合、この呼び出しは内部バッファ buf に対して std :: wcrtomb ( buf, L ' \0 ' , ps ) を呼び出すことと等価です。

wcがヌルワイド文字 L ' \0 ' である場合、初期シフト状態を復元するために必要なシフトシーケンスに続けてヌルバイトが格納され、変換状態パラメータ * ps は初期シフト状態を表すように更新されます。

目次

パラメータ

s - マルチバイト文字が格納されるナロウ文字配列へのポインタ
wc - 変換対象のワイド文字
ps - マルチバイト文字列を解釈する際に使用される変換状態オブジェクトへのポインタ

戻り値

成功時は、 s が指す先頭要素を持つ文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返します。

失敗時( wc が有効なワイド文字でない場合)、 static_cast < std:: size_t > ( - 1 ) を返し、 EILSEQ errno に格納し、 * ps を未規定の状態のままにする。

#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
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"; // or 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

関連項目

ワイド文字をマルチバイト表現に変換する
(関数)
状態を指定して次のマルチバイト文字をワイド文字に変換する
(関数)
[virtual]
InternT から ExternT への文字列変換(ファイル書き込み時など)
( std::codecvt<InternT,ExternT,StateT> の仮想protectedメンバ関数)