名前空間
変種
操作

std::c32rtomb

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

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

s がヌルポインタでなければ、 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 によって最初の要素が指されている文字配列に書き込まれた (あらゆるシフトシーケンスを含む) バイト数を返します。 この値は、例えば複数の char32_t の文字のシーケンスの先行する char32_t を処理するとき (UTF-32 では発生しません) など、 0 になる場合があります。

失敗した場合 (c32 が有効な32ビット文字でない場合) は、 -1 を返し、 EILSEQerrno に格納し、 *ps を未規定な状態に置きます。

[編集]

#include <iostream>
#include <iomanip>
#include <string_view>
#include <clocale>
#include <cuchar>
#include <climits>
 
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 << 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 << 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 エンコーディングに変換します
(関数) [edit]
[仮想]
ファイルを書き込む時などのために、文字列を internT から externT に変換します
(std::codecvt<InternT,ExternT,State>の仮想プロテクテッドメンバ関数) [edit]