std::ctype<CharT>::narrow, do_narrow
Von cppreference.com
| Definiert in Header <locale> |
||
| public: char narrow( CharT c, char dflt ) const; |
(1) | |
| public: const CharT* narrow( const CharT* beg, const CharT* end, |
(2) | |
| protected: virtual char do_narrow( CharT c, char dflt ) const; |
(3) | |
| protected: virtual const CharT* do_narrow( const CharT* beg, const CharT* end, |
(4) | |
1,2) Öffentliche Memberfunktion, ruft die entsprechende geschützte virtuelle Memberfunktion
do_narrow der am weitesten abgeleiteten Klasse auf. Überladung (1) ruft do_narrow(c, dflt) auf, Überladung (2) ruft do_narrow(beg, end, dflt, dst) auf.3) Konvertiert das (möglicherweise breite) Zeichen c in eine Multibyte-Darstellung, wenn das Zeichen mit einem einzelnen Byte dargestellt werden kann (z. B. sind ASCII-Zeichen in UTF-8-Kodierung einzelne Bytes). Gibt dflt zurück, wenn eine solche Konvertierung nicht existiert.
4) Für jedes Zeichen im Zeichen-Array
[beg, end) werden schmale Zeichen (oder dflt, falls die Konvertierung fehlschlägt) in die aufeinanderfolgenden Speicherorte im Zeichen-Array geschrieben, auf die dst zeigt.Die Konvertierung ist immer erfolgreich und immer umkehrbar (durch Aufruf von widen()) für alle Zeichen aus dem grundlegenden Quellzeichen-Set(bis C++23)grundlegenden Zeichen-Set(seit C++23).
- d.h. do_widen(do_narrow(c, 0)) == c gilt immer für jedes Zeichen c aus dem grundlegenden Quellzeichen-Set(bis C++23)grundlegenden Zeichen-Set(seit C++23).
Die Konvertierung bewahrt, falls erfolgreich, alle Zeichenklassifizierungskategorien, die is() bekannt sind.
- d.h. is(m, c) || !ctc.is(m, do_narrow(c, dflt)) ist immer true für jede benannte
ctype-Kategorie mit einem Facette ctc vom Typctype<char>und einemctype_base::mask-Wert m (es sei denn,do_narrowgibt dflt zurück).
Die Konvertierung eines Ziffernzeichens garantiert, dass die Differenz zwischen dem Ergebnis und dem Zeichenliteral '0' dem Ziffernwert des ursprünglichen Zeichens entspricht.
- d.h. für jedes Ziffernzeichen c ergibt der Ausdruck (do_narrow(c, dflt) - '0') den Ziffernwert des Zeichens.
Inhalt |
[edit] Parameter
| c | - | zu konvertierendes Zeichen |
| dflt | - | Standardwert, der zurückgegeben wird, wenn die Konvertierung fehlschlägt |
| beg | - | Zeiger auf das erste Zeichen in einem Array von Zeichen, das konvertiert werden soll |
| end | - | Zeiger auf die Position nach dem letzten Zeichen im Array von Zeichen, das konvertiert werden soll |
| dst | - | Zeiger auf das erste Element des zu füllenden Zeichen-Arrays |
[edit] Rückgabewert
1,3) Das schmalere Zeichen oder dflt, wenn die Konvertierung fehlschlägt.
2,4) end
[edit] Beispiel
Führen Sie diesen Code aus
#include <iostream> #include <locale> void try_narrow(const std::ctype<wchar_t>& f, wchar_t c) { char n = f.narrow(c, 0); if (n) std::wcout << '\'' << c << "' narrowed to " << +(unsigned char)n << '\n'; else std::wcout << '\'' << c << "' could not be narrowed\n"; } int main() { std::locale::global(std::locale("en_US.utf8")); std::wcout.imbue(std::locale()); std::wcout << std::hex << std::showbase << "In US English UTF-8 locale:\n"; auto& f = std::use_facet<std::ctype<wchar_t>>(std::locale()); try_narrow(f, L'A'); try_narrow(f, L'A'); try_narrow(f, L'ě'); std::locale::global(std::locale("cs_CZ.iso88592")); auto& f2 = std::use_facet<std::ctype<wchar_t>>(std::locale()); std::wcout << "In Czech ISO-8859-2 locale:\n"; try_narrow(f2, L'A'); try_narrow(f2, L'A'); try_narrow(f2, L'ě'); }
Mögliche Ausgabe
In US English UTF-8 locale: 'A' narrowed to 0x41 'A' could not be narrowed 'ě' could not be narrowed In Czech ISO-8859-2 locale: 'A' narrowed to 0x41 'A' could not be narrowed 'ě' narrowed to 0xec
[edit] 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 126 | C++98 | 1. Der Code, der die Umkehrbarkeit repräsentierte, war do_widen(do_narrow(c), 0) == c 2. Der Code, der die Erhaltung der Kategorie repräsentierte, war is(m, c) || !ctc.is(m, do_narrow(c), dflt) |
beides korrigiert |
| LWG 153 | C++98 | narrow rief immer Überladung (4) auf |
ruft die entsprechende Überladung auf |
[edit] Siehe auch
ruft do_widen auf(öffentliche Memberfunktion) | |
| verengt Zeichen (public member function of std::basic_ios<CharT,Traits>) | |
| verengt ein Wide-Zeichen zu einem ein Byte breiten schmalen Zeichen, falls möglich (Funktion) |