std:: mbrtoc16
|
Definiert im Header
<cuchar>
|
||
|
std::
size_t
mbrtoc16
(
char16_t
*
pc16,
const
char
*
s,
std:: size_t n, std:: mbstate_t * ps ) ; |
(seit C++11) | |
Konvertiert ein schmales Multibyte-Zeichen in die UTF-16-Zeichendarstellung.
Wenn s kein Nullzeiger ist, untersucht die Funktion maximal n Bytes der Multibyte-Zeichenkette, beginnend mit dem von s gezeigten Byte, um die Anzahl der Bytes zu bestimmen, die zur Vervollständigung des nächsten Multibyte-Zeichens (einschließlich aller Shift-Sequenzen) erforderlich sind. Wenn die Funktion feststellt, dass das nächste Multibyte-Zeichen in s vollständig und gültig ist, konvertiert sie es in das entsprechende 16-Bit-Zeichen und speichert es in * pc16 (falls pc16 nicht null ist).
Wenn das Multibyte-Zeichen in
*
s
einer Multi-
char16_t
-Sequenz entspricht (z.B. einem Ersatzpaar in UTF-16), dann wird nach dem ersten Aufruf dieser Funktion
*
ps
so aktualisiert, dass der nächste Aufruf von
mbrtoc16
das zusätzliche
char16_t
ausgibt, ohne
*
s
zu berücksichtigen.
Wenn s ein Nullzeiger ist, werden die Werte von n und pc16 ignoriert und der Aufruf entspricht std :: mbrtoc16 ( nullptr, "" , 1 , ps ) .
Wenn das erzeugte Breitzeichen das Nullzeichen ist, repräsentiert der Konvertierungszustand * ps den initialen Schaltzustand.
Die von dieser Funktion verwendete Multibyte-Kodierung wird durch das aktuell aktive C-Locale festgelegt.
Inhaltsverzeichnis |
Parameter
| pc16 | - | Zeiger auf den Speicherort, an den das resultierende 16-Bit-Zeichen geschrieben wird |
| s | - | Zeiger auf die als Eingabe verwendete Multibyte-Zeichenkette |
| n | - | Begrenzung der Anzahl der Bytes in s, die untersucht werden können |
| ps | - | Zeiger auf das Konvertierungszustandsobjekt, das bei der Interpretation der Multibyte-Zeichenkette verwendet wird |
Rückgabewert
Das erste der folgenden zutreffenden Kriterien:
- 0 wenn das von s konvertierte Zeichen (und gespeichert in * pc16 falls nicht null) das Nullzeichen war.
-
die Anzahl der Bytes
[1,n]des Multibyte-Zeichens, das erfolgreich von s konvertiert wurde. - - 3 wenn das nächste char16_t aus einem Multi- char16_t -Zeichen (z.B. ein Surrogatpaar) nun in * pc16 geschrieben wurde. In diesem Fall werden keine Bytes von der Eingabe verarbeitet.
- - 2 wenn die nächsten n Bytes ein unvollständiges, aber bisher gültiges Multibyte-Zeichen bilden. Nichts wird nach * pc16 geschrieben.
- - 1 wenn ein Kodierungsfehler auftritt. Nichts wird nach * pc16 geschrieben, der Wert EILSEQ wird in errno gespeichert und der Wert von * ps ist nicht spezifiziert.
Beispiel
#include <clocale> #include <cstring> #include <cuchar> #include <cwchar> #include <iomanip> #include <iostream> int main() { std::setlocale(LC_ALL, "en_US.utf8"); std::string str{"z\u00df\u6c34\U0001F34C"}; // or u8"zß水🍌" std::cout << "Processing " << str.size() << " bytes: [" << std::uppercase << std::setfill('0') << std::hex; for (int n{}; unsigned char c : str) std::cout << (n++ ? " " : "") << +c; std::cout << "]\n"; std::mbstate_t state{}; // zero-initialized to initial state char16_t c16{}; const char* ptr{&str[0]}, *end{&str[0] + str.size()}; while (std::size_t rc{std::mbrtoc16(&c16, ptr, end - ptr + 1, &state)}) { std::cout << "Next UTF-16 char: " << std::setw(4) << static_cast<unsigned short>(c16) << " obtained from "; if (rc == std::size_t(-3)) std::cout << "earlier surrogate pair\n"; else if (rc == std::size_t(-2)) continue; else if (rc == std::size_t(-1)) break; else { std::cout << std::dec << rc << " bytes ["; for (std::size_t n{}; n != rc; ++n) std::cout << (n ? " " : "") << std::hex << +static_cast<unsigned char>(ptr[n]); std::cout << "]\n"; ptr += rc; } } }
Ausgabe:
Processing 10 bytes: [7A C3 9F E6 B0 B4 F0 9F 8D 8C] Next UTF-16 char: 007A obtained from 1 bytes [7A] Next UTF-16 char: 00DF obtained from 2 bytes [C3 9F] Next UTF-16 char: 6C34 obtained from 3 bytes [E6 B0 B4] Next UTF-16 char: D83C obtained from 4 bytes [F0 9F 8D 8C] Next UTF-16 char: DF4C obtained from earlier surrogate pair
Siehe auch
|
(C++11)
|
wandelt ein UTF-16-Zeichen in eine schmale Multibyte-Kodierung um
(Funktion) |
|
(C++20)
|
wandelt ein schmales Multibyte-Zeichen in UTF-8-Kodierung um
(Funktion) |
|
[virtual]
|
wandelt eine Zeichenkette von
ExternT
zu
InternT
um, z.B. beim Lesen aus einer Datei
(virtuelle geschützte Memberfunktion von
std::codecvt<InternT,ExternT,StateT>
)
|
|
C-Dokumentation
für
mbrtoc16
|
|