名前空間
変種
操作

std::c32rtomb

From cppreference.com
< cpp‎ | string‎ | multibyte
 
 
 
 
ヘッダー <cuchar> で定義
std::size_t c32rtomb( char* s, char32_t c32, std::mbstate_t* ps );
(C++11以降)

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

s がヌルポインタでない場合、関数は *ps の現在のマルチバイト変換状態を考慮に入れ(シフトシーケンスを含む)、c32 のマルチバイト文字表現を格納するために必要なバイト数を決定し、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 を返し、*ps の状態は未定義のまま、errnoEILSEQ が格納されます。

[編集]

#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> の virtual protected メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)