Namespaces
Variants

std:: mbrtoc16

From cppreference.net
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