Namespaces
Variants

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

From cppreference.net
Definiert im Header <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) Öffentliche Memberfunktion, ruft die Memberfunktion do_out der am stärksten abgeleiteten Klasse auf.
2) Falls diese codecvt -Facette eine Konvertierung definiert, übersetzt sie die internen Zeichen aus dem Quellbereich [ from , from_end ) in externe Zeichen und platziert die Ergebnisse in den nachfolgenden Positionen beginnend bei to . Konvertiert nicht mehr als from_end - from interne Zeichen und schreibt nicht mehr als to_end - to externe Zeichen. Lässt from_next und to_next auf das Element nach dem letzten erfolgreich konvertierten Zeichen zeigen.

Wenn diese codecvt Facette keine Konvertierung definiert, werden keine Zeichen konvertiert. to_next wird gleich to gesetzt, state bleibt unverändert und std::codecvt_base::noconv wird zurückgegeben.

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) muss ok zurückgeben, wenn

  • Diese codecvt Facette wird von basic_filebuf verwendet, und
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) würde ok zurückgeben, wobei from ! = from_end .

Inhaltsverzeichnis

Rückgabewert

Ein Wert vom Typ std::codecvt_base::result , der den Erfolgsstatus wie folgt anzeigt:

ok Konvertierung abgeschlossen
partial unzureichender Platz im Ausgabepuffer oder unerwartetes Ende des Quellpuffers
error es wurde ein nicht konvertierbares Zeichen angetroffen
noconv diese Facette ist nicht-konvertierend, keine Ausgabe geschrieben

Die nicht-konvertierende Spezialisierung std:: codecvt < char , char , std:: mbstate_t > gibt immer std::codecvt_base::noconv zurück.

Hinweise

Erfordert, dass from <= from_end && to <= to_end und dass state entweder den initialen Shift-Zustand repräsentiert oder durch Konvertierung der vorherigen Zeichen in der Sequenz erhalten wurde.

Während codecvt N:M-Konvertierungen unterstützt (z.B. UTF-16 zu UTF-8, wo zwei interne Zeichen notwendig sein können, um zu entscheiden, welche externen Zeichen ausgegeben werden sollen), std::basic_filebuf kann nur codecvt Facetten verwenden, die eine 1:N-Konvertierung definieren, das heißt es muss in der Lage sein, ein internes Zeichen nach dem anderen zu verarbeiten, wenn in eine Datei geschrieben wird.

Bei der Durchführung von N:M-Konvertierungen kann diese Funktion std::codecvt_base::partial zurückgeben, nachdem alle Quellzeichen verarbeitet wurden ( from_next == from_end ). Dies bedeutet, dass ein weiteres internes Zeichen benötigt wird, um die Konvertierung abzuschließen (z.B. bei der Konvertierung von UTF-16 zu UTF-8, wenn das letzte Zeichen im Quellpuffer ein High-Surrogate ist).

Die Auswirkung auf state ist absichtlich nicht spezifiziert. In Standard-Facets wird es verwendet, um den Shift-Zustand beizubehalten, wie beim Aufruf von std:: wcsrtombs , und wird daher aktualisiert, um den Shift-Zustand nach dem letzten erfolgreich konvertierten Zeichen widerzuspiegeln, aber eine benutzerdefinierte Facette kann es frei verwenden, um jeden anderen Zustand zu verwalten, z.B. die Anzahl der speziellen Zeichen zu zählen.

Beispiel

#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ß水🍌"
    // Hinweis: Das Folgende könnte auch mit wstring_convert umgesetzt werden
    std::mbstate_t mb{}; // initialer Schaltzustand
    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);
    // Fehlerüberprüfung der Kürze halber ausgelassen
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

Ausgabe:

The string in narrow multibyte encoding: zß水🍌

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 76 C++98 es war unklar, ob die Konvertierung erforderlich ist,
um ein internes Zeichen auf einmal zu verarbeiten
nur erforderlich, wenn verwendet
durch basic_filebuf

Siehe auch

[virtual]
Schreibt Zeichen aus dem Put-Bereich in die zugehörige Datei
(virtuelle geschützte Elementfunktion von std::basic_filebuf<CharT,Traits> )
Konvertiert eine Breitzeichen-Zeichenkette in eine Byte-Zeichenkette
(öffentliche Elementfunktion von std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
Konvertiert eine Breitzeichen-Zeichenkette in eine schmale Multibyte-Zeichenkette mit Zustand
(Funktion)
[virtual]
Konvertiert eine Zeichenkette von ExternT zu InternT , beispielsweise beim Lesen aus einer Datei
(virtuelle geschützte Elementfunktion)