Namespaces
Variants

std:: c32rtomb

From cppreference.net
定義済みヘッダー <cuchar>
std:: size_t c32rtomb ( char * s, char32_t c32, std:: mbstate_t * ps ) ;
(C++11以降)

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

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

s がヌルポインタの場合、この呼び出しは内部バッファ buf を用いた std :: c32rtomb ( buf, U ' \0 ' , ps ) と等価です。

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

この関数で使用されるマルチバイトエンコーディングは、現在アクティブなCロケールによって指定されます。

目次

パラメータ

s - マルチバイト文字が格納されるナロウ文字配列へのポインタ
c32 - 変換対象の32ビット文字
ps - マルチバイト文字列の解釈時に使用される変換状態オブジェクトへのポインタ

戻り値

成功時は、 s が指す先頭要素の文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返す。この値は 0 の場合もある(例:マルチ char32_t 文字シーケンスの最初の char32_t を処理する場合。UTF-32では発生しない)。

失敗時( c32 が有効な32ビット文字でない場合)、 - 1 を返し、 EILSEQ errno に格納し、 * ps を未規定の状態のままにする。

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u32string_view strv = U"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-32 code units: [ ";
    for (char32_t c : strv)
        std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';
    std::cout << "]\n";
    std::mbstate_t state{};
    char out[MB_LEN_MAX]{};
    for (char32_t c : strv)
    {
        std::size_t rc = std::c32rtomb(out, c, &state);
        std::cout << static_cast<int>(c) << " converted to [ ";
        if (rc != (std::size_t) - 1)
            for (unsigned char c8 : std::string_view{out, rc})
                std::cout << +c8 << ' ';
        std::cout << "]\n";
    }
}

出力:

Processing 4 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0x1f34c converted to [ 0xf0 0x9f 0x8d 0x8c ]

関連項目

(C++11)
ナローマルチバイト文字をUTF-32エンコーディングに変換する
(関数)
[virtual]
InternT から ExternT への文字列変換を実行する(ファイル書き込み時など)
( std::codecvt<InternT,ExternT,StateT> の仮想保護メンバ関数)