Namespaces
Variants

std:: c16rtomb

From cppreference.net
ヘッダーで定義 <cuchar>
std:: size_t c16rtomb ( char * s, char16_t c16, std:: mbstate_t * ps ) ;
(C++11以降)

可変長16ビット文字表現(通常はUTF-16)から単一のコードポイントをナローマルチバイト文字表現に変換します。

s が null ポインタでなく、かつ c16 が有効な可変長エンコーディングのコードポイントの最後の16ビットコードユニットである場合、この関数はそのコードポイントのマルチバイト文字表現を格納するために必要なバイト数(シフトシーケンスを含み、現在のマルチバイト変換状態 * ps を考慮して)を決定し、そのマルチバイト文字表現を s が指す先頭要素の文字配列に格納し、必要に応じて * ps を更新します。この関数によって書き込まれるバイト数は最大で MB_CUR_MAX バイトです。

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

c16 が16ビットワイド文字表現の最終コード単位でない場合、配列 s への書き込みは行われず、 * ps のみが更新されます。

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

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

目次

パラメータ

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

戻り値

成功時は、 s が指す先頭要素を持つ文字配列に書き込まれたバイト数(シフトシーケンスを含む)を返します。この値は 0 の場合があります(例:サロゲートペアの最初の char16_t を処理する場合)。

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

注記

C++標準はこの関数の意味論についてC標準に従います。公開されたC11では、 std::mbrtoc16 が可変長マルチバイト(UTF-8など)から可変長16ビット(UTF-16など)エンコーディングへの変換を行うのとは異なり、この関数は単一単位の16ビットエンコーディングのみ変換可能です。つまり、この関数の本来の目的であったUTF-16からUTF-8への変換はできません。この問題はC11以降の欠陥報告書 DR488 によって修正されました。

この例では、 欠陥報告書488 の修正が適用されていることを前提としています。

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u16string_view strv = u"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-16 code units: [ ";
    for (char16_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 (char16_t c : strv)
    {
        std::size_t rc = std::c16rtomb(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 5 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0xd83c converted to [ ]
0xdf4c converted to [ 0xf0 0x9f 0x8d 0x8c ]

関連項目

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