std::codecvt<InternT,ExternT,StateT>::in, std::codecvt<InternT,ExternT,StateT>::do_in
| Definiert in Header <locale> |
||
| public: result in( StateT& state, |
(1) | |
| protected: virtual result do_in( StateT& state, |
(2) | |
do_in der am weitesten abgeleiteten Klasse auf.codecvt-Facet eine Konvertierung definiert, werden die externen Zeichen aus dem Quellbereich [from, from_end) in interne Zeichen umgewandelt und die Ergebnisse an den nachfolgenden Speicherstellen beginnend bei to platziert. Es werden nicht mehr als from_end - from externe Zeichen konvertiert und nicht mehr als to_end - to interne Zeichen geschrieben. from_next und to_next zeigen auf das Element, das auf das letzte erfolgreich konvertierte Element folgt.Wenn dieses codecvt-Facet 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_in(state, from, from_end, from_next, to, to + 1, to_next) muss ok zurückgeben, wenn
- dieses
codecvt-Facet von basic_filebuf verwendet wird, und - do_in(state, from, from_end, from_next, to, to_end, to_next)
okzurückgeben würde, wobei to != to_end gilt.
Inhalt |
[bearbeiten] Rückgabewert
Ein Wert vom Typ std::codecvt_base::result, der den folgenden Erfolgstatus angibt:
ok
|
Konvertierung abgeschlossen |
partiell
|
nicht genügend Speicher im Ausgabepuffer oder unerwartetes Ende des Quellpuffers |
error
|
auf ein Zeichen gestoßen, das nicht konvertiert werden konnte |
noconv
|
dieses Facet 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.
[bearbeiten] Hinweise
Voraussetzung ist, dass from <= from_end && to <= to_end gilt und dass state entweder den anfänglichen Shift-Zustand repräsentiert oder durch Konvertierung der vorhergehenden Zeichen in der Sequenz erhalten wurde.
Die Auswirkung auf state ist absichtlich nicht spezifiziert. In Standard-Facets wird sie zur Beibehaltung des Shift-Zustands verwendet, wie beim Aufruf von std::mbsrtowcs, und wird daher aktualisiert, um den Konvertierungszustand nach dem letzten verarbeiteten externen Zeichen widerzuspiegeln. Ein benutzerdefiniertes Facet kann es jedoch frei verwenden, um jeden anderen Zustand beizubehalten, z. B. die Anzahl der Sonderzeichen zu zählen.
[bearbeiten] Beispiel
#include <iostream> #include <locale> #include <string> int main() { std::locale::global(std::locale("en_US.utf8")); auto const& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>> (std::locale()); std::string external = "z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋" // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b" // note that the following can be done with wstring_convert std::mbstate_t mb = std::mbstate_t(); // initial shift state std::wstring internal(external.size(), '\0'); const char* from_next; wchar_t* to_next; f.in(mb, &external[0], &external[external.size()], from_next, &internal[0], &internal[internal.size()], to_next); // error checking skipped for brevity internal.resize(to_next - &internal[0]); std::wcout << L"The string in wide encoding: " << internal << '\n'; }
Ausgabe
The string in wide encoding: zß水𝄋
[bearbeiten] 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 | war unklar, ob die Konvertierung erforderlich ist, um die Produktion eines internen Zeichens nach dem anderen zu unterstützen |
nur erforderlich, wenn verwendet von basic_filebuf |
[bearbeiten] Siehe auch
| [virtuell] |
liest aus der zugeordneten Datei (virtuelle protected Memberfunktion von std::basic_filebuf<CharT,Traits>) |
| konvertiert einen Byte-String in einen Wide-String (öffentliche Member-Funktion von std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>) | |
| konvertiert einen schmalen Multibyte-Zeichenstring in einen Wide-String, gegeben den Zustand (Funktion) | |
| [virtuell] |
konvertiert eine Zeichenkette von InternT nach ExternT, z. B. beim Schreiben in eine Datei(virtual protected member function) |