Namespaces
Variants

std:: c16rtomb

From cppreference.net
Definiert im Header <cuchar>
std:: size_t c16rtomb ( char * s, char16_t c16, std:: mbstate_t * ps ) ;
(seit C++11)

Konvertiert einen einzelnen Codepunkt von der variablen 16-Bit-Zeichendarstellung (typischerweise UTF-16) in eine schmale Multibyte-Zeichendarstellung.

Wenn s kein Nullzeiger ist und c16 die letzte 16-Bit-Codeeinheit in einer gültigen variablen Längenkodierung eines Codepoints ist, bestimmt die Funktion die Anzahl der Bytes, die notwendig sind, um die Multibyte-Zeichendarstellung dieses Codepoints zu speichern (einschließlich aller Shift-Sequenzen und unter Berücksichtigung des aktuellen Multibyte-Konvertierungszustands * ps ), und speichert die Multibyte-Zeichendarstellung im Zeichenarray, dessen erstes Element durch s gezeigt wird, wobei * ps bei Bedarf aktualisiert wird. Höchstens MB_CUR_MAX Bytes können von dieser Funktion geschrieben werden.

Wenn s ein Nullzeiger ist, entspricht der Aufruf std :: c16rtomb ( buf, u ' \0 ' , ps ) für einen internen Puffer buf .

Wenn c16 nicht das letzte Codeelement in einer 16-Bit-Darstellung eines Breitzeichens ist, schreibt es nicht in das durch s adressierte Array, nur * ps wird aktualisiert.

Wenn c16 das breite Nullzeichen ist u ' \0 ' , wird ein Nullbyte gespeichert, vorangestellt von jeder Shift-Sequenz, die notwendig ist, um den initialen Shift-Zustand wiederherzustellen, und der Konvertierungszustandsparameter * ps wird aktualisiert, um den initialen Shift-Zustand darzustellen.

Die von dieser Funktion verwendete Multibyte-Kodierung wird durch das aktuell aktive C-Locale festgelegt.

Inhaltsverzeichnis

Parameter

s - Zeiger auf ein schmales Zeichenarray, in dem das Multibyte-Zeichen gespeichert wird
c16 - das zu konvertierende 16-Bit-Zeichen
ps - Zeiger auf das Konvertierungszustandsobjekt, das bei der Interpretation der Multibyte-Zeichenkette verwendet wird

Rückgabewert

Bei Erfolg gibt die Anzahl der Bytes (einschließlich aller Shift-Sequenzen) zurück, die in das Zeichenarray geschrieben wurden, dessen erstes Element durch s gezeigt wird. Dieser Wert kann 0 sein, z.B. bei der Verarbeitung des ersten char16_t in einem Surrogat-Paar.

Bei Fehler (wenn c16 kein gültiges 16-Bit-Zeichen ist), wird - 1 zurückgegeben, EILSEQ in errno gespeichert und * ps in einem nicht spezifizierten Zustand belassen.

Hinweise

Der C++-Standard verweist für die Semantik dieser Funktion auf den C-Standard. In der veröffentlichten C11-Version kann diese Funktion, anders als std::mbrtoc16 , die variable Breiten von Multibyte-Zeichen (wie UTF-8) in variable 16-Bit-Codierungen (wie UTF-16) umwandelt, nur Einheiten mit 16-Bit-Codierung konvertieren. Das bedeutet, sie kann UTF-16 nicht in UTF-8 umwandeln, obwohl dies die ursprüngliche Absicht dieser Funktion war. Dies wurde durch den nach C11 veröffentlichten Fehlerbericht DR488 korrigiert.

Beispiel

Das Beispiel geht davon aus, dass der Fix für den Defect Report 488 angewendet wurde.

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u16string_view strv = u"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-16 code units: [ ";
    for (char16_t c : strv)
        std::cout << std::showbase << std::hex << static_cast<int>(c) << ' ';
    std::cout << "]\n";
    std::mbstate_t state{};
    char out[MB_LEN_MAX]{};
    for (char16_t c : strv)
    {
        std::size_t rc = std::c16rtomb(out, c, &state);
        std::cout << static_cast<int>(c) << " converted to [ ";
        if (rc != (std::size_t) - 1)
            for (unsigned char c8 : std::string_view{out, rc})
                std::cout << +c8 << ' ';
        std::cout << "]\n";
    }
}

Ausgabe:

Processing 5 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0xd83c converted to [ ]
0xdf4c converted to [ 0xf0 0x9f 0x8d 0x8c ]

Siehe auch

(C++11)
wandelt ein schmalzeichen Multibyte-Zeichen in UTF-16-Kodierung um
(Funktion)
(C++20)
wandelt eine UTF-8-Zeichenkette in schmalzeichen Multibyte-Kodierung um
(Funktion)
[virtual]
wandelt eine Zeichenkette von InternT zu ExternT um, z.B. beim Schreiben in eine Datei
(virtuelle geschützte Elementfunktion von std::codecvt<InternT,ExternT,StateT> )
C-Dokumentation für c16rtomb