名前空間
変種
操作

std::c16rtomb

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

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

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

もしsがヌルポインタである場合、その呼び出しは、ある内部バッファ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を返し、EILSEQerrnoに格納し、*psを未指定の状態のままにします。

[編集] 注記

C++標準では、この関数のセマンティクスについてC標準を参照します。発行されたC11では、可変幅マルチバイト(UTF-8など)を可変幅16ビット(UTF-16など)エンコーディングに変換するstd::mbrtoc16とは異なり、この関数は単一ユニットの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> の virtual protected メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)