名前空間
変種
操作

std::codecvt::out, do_out

提供: cppreference.com
< cpp‎ | locale‎ | codecvt
 
 
 
 
ヘッダ <locale> で定義
public:

result out( StateT& state,
            const InternT* from,
            const InternT* from_end,
            const InternT*& from_next,
            ExternT* to,
            ExternT* to_end,

            ExternT*& to_next ) const;
(1)
protected:

virtual result do_out( StateT& state,
                       const InternT* from,
                       const InternT* from_end,
                       const InternT*& from_next,
                       ExternT* to,
                       ExternT* to_end,

                       ExternT*& to_next ) const;
(2)
1) public メンバ関数。 最も派生したクラスのメンバ関数 do_out を呼びます。
2) この codecvt ファセットが変換を定義する場合、ソース範囲 [from, from_end) の内部文字を外部文字に変換し、その結果を to から始まる後続の位置に格納します。 最大 from_end - from 個の内部文字を変換し、最大 to_end - to 個の外部文字を書き込みます。 from_next および to_next を変換に成功した最後の要素のひとつ次を指すようにします。
この codecvt ファセットが変換を定義しない場合、文字は変換されません。 to_nextto と等しい値に設定され、 state は変更されず、そして std::codecvt_base::noconv が返されます。

目次

[編集] 戻り値

以下のような成功ステータスを表す std::codecvt_base::result 型の値。

ok 変換が完了しました
partial 出力バッファに十分な空きがないか、ソースバッファが予期せず終了しました
error 変換できない文字に遭遇しました
noconv このファセットは変換を行いません。 書き込まれた出力はありません

変換を行わない std::codecvt<char, char, std::mbstate_t> の特殊化は常に std::codecvt_base::noconv を返します。

[編集] ノート

from <= from_end && to <= to_end であること、および、 state が初期シフト状態を表すかシーケンス内の先行する文字を変換することによって取得されたかのいずれかであることを要求します。

codecvt が N:M の変換 (例えば、出力する外部文字を決定するために2つの内部文字が必要なことがある UTF-16 から UTF-8 への変換など) をサポートするのに対し、 std::basic_filebuf は 1:N の変換を定義するファセットのみ使用できます。 つまり、ファイルに書き込むときは一度にひとつの内部文字を処理できなければなりません。

N:M の変換を行うとき、この関数はすべてのソース文字を消費した後 (from_next == from_end)、 std::codecvt_base::partial を返すことがあります。 これは変換を完了するために別の内部文字が必要であることを意味します (例えば、 UTF-16 から UTF-8 に変換するときに、ソースバッファの最後の文字が上位サロゲートの場合など)。

state に対する効果は意図的に未規定になっています。 標準のファセットでは、これは std::wcsrtombs を呼んだときのようにシフト状態を管理し、そのため最後の変換に成功した文字の後のシフト状態を反映するように更新されますが、ユーザ定義のファセットは任意の他の状態 (例えば特殊な文字に遭遇した回数など) を管理するために自由に使用することができます。

[編集]

#include <iostream>
#include <string>
#include <locale>
 
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());
    std::wstring internal = L"z\u00df\u6c34\U0001f34c"; // L"zß水🍌"
 
    // note that the following can be done with wstring_convert
    std::mbstate_t mb{}; // initial shift state
    std::string external(internal.size() * f.max_length(), '\0'); 
    const wchar_t* from_next;
    char* to_next;
    f.out(mb, &internal[0], &internal[internal.size()], from_next,
              &external[0], &external[external.size()], to_next);
    // error checking skipped for brevity
    external.resize(to_next - &external[0]);
 
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

出力:

The string in narrow multibyte encoding: zß水🍌

[編集] 関連項目

[仮想]
put 領域から紐付けられているファイルに文字を書き込みます
(std::basic_filebufの仮想プロテクテッドメンバ関数) [edit]
ワイド文字列をバイト文字列に変換します
(std::wstring_convertのパブリックメンバ関数) [edit]
指定された状態を使用してワイド文字列をマルチバイト文字列に変換します
(関数) [edit]
[仮想]
ファイルから読み込む時などのために、文字列を externT から internT に変換します
(仮想プロテクテッドメンバ関数) [edit]