Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: out, do_out

From cppreference.net
ヘッダーで定義 <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) 公開メンバ関数。最も派生したクラスのメンバ関数 do_out を呼び出します。
2) この codecvt ファセットが変換を定義する場合、内部文字をソース範囲 [ from , from_end ) から外部文字へ変換し、結果を to から始まる後続の位置に配置する。 from_end - from を超える内部文字を変換せず、 to_end - to を超える外部文字を書き込まない。 from_next to_next は正常に変換された最後の要素の次を指すように設定される。

この codecvt ファセットが変換を定義していない場合、いかなる文字も変換されません。 to_next to と等しく設定され、 state は変更されず、 std::codecvt_base::noconv が返されます。

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) ok を返さなければならない

  • この codecvt ファセットは basic_filebuf によって使用され、
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) ok を返す。ここで from ! = from_end である。

目次

戻り値

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変換(例えばUTF-16からUTF-8への変換では、出力する外部文字を決定するために2つの内部文字が必要な場合がある)をサポートする一方で、 std::basic_filebuf が使用できるのは1:N変換を定義する codecvt ファセットのみです。つまり、ファイルへの書き込み時に一度に1つの内部文字を処理できる必要があります。

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

state への影響は意図的に未指定とされています。標準ファセットでは、これは std:: wcsrtombs を呼び出す場合と同様にシフト状態を維持するために使用され、したがって最後に正常に変換された文字の後のシフト状態を反映するように更新されますが、ユーザー定義ファセットはこれを自由に使用して、例えば遭遇した特殊文字の数をカウントするなど、他の任意の状態を維持することができます。

#include <iostream>
#include <locale>
#include <string>
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ß水🍌"
    // 以下の処理はwstring_convertでも実装可能
    std::mbstate_t mb{}; // 初期シフト状態
    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);
    // 簡潔さのためエラーチェックは省略
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

出力:

The string in narrow multibyte encoding: zß水🍌

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 76 C++98 1度に1つの内部文字を取得することをサポートする変換が必要かどうかが不明確
使用される場合にのみ必要
by basic_filebuf

関連項目

[virtual]
パット領域から関連付けられたファイルへ文字を書き込む
( std::basic_filebuf<CharT,Traits> の仮想protectedメンバ関数)
ワイド文字列をバイト文字列に変換する
( std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> のpublicメンバ関数)
状態を指定してワイド文字列をナローマルチバイト文字列に変換する
(関数)
[virtual]
ExternT から InternT への文字列変換(ファイルからの読み取り時など)
(仮想protectedメンバ関数)