std::codecvt<InternT,ExternT,StateT>:: out, do_out
|
Definiert im Header
<locale>
|
||
|
public
:
result out
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_out
(
StateT
&
state,
|
(2) | |
do_out
der am stärksten abgeleiteten Klasse auf.
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
codecvtFacette wird von basic_filebuf verwendet, und -
do_out
(
state, from, from_end, from_next, to, to_end, to_next
)
würde
okzurü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) |