Namensräume
Varianten
Aktionen

c16rtomb

Von cppreference.com
< c‎ | string‎ | multibyte
Definiert im Header <uchar.h>
size_t c16rtomb( char* restrict s, char16_t c16, mbstate_t* restrict ps );
(seit C11)

Konvertiert einen einzelnen Code-Punkt von seiner variablen 16-Bit-Breitzeichen-Darstellung (typischerweise UTF-16) in seine schmale Multibyte-Zeichen-Darstellung.

Wenn s kein Null-Zeiger ist und c16 die letzte 16-Bit-Codeeinheit in einer gültigen variablen Längen-Kodierung eines Code-Punktes ist, ermittelt die Funktion die Anzahl der Bytes, die zur Speicherung der Multibyte-Zeichen-Darstellung dieses Code-Punktes notwendig sind (einschließlich etwaiger Shift-Sequenzen und unter Berücksichtigung des aktuellen Multibyte-Konvertierungszustands *ps), speichert die Multibyte-Zeichen-Darstellung im Zeichen-Array, auf dessen erstes Element s zeigt, und aktualisiert *ps entsprechend. Maximal MB_CUR_MAX Bytes können von dieser Funktion geschrieben werden.

Wenn s ein Null-Zeiger ist, ist der Aufruf äquivalent zu c16rtomb(buf, u'\0', ps) für einen internen Puffer buf.

Wenn c16 das Null-Breitzeichen u'\0' ist, wird ein Null-Byte gespeichert, dem jede Shift-Sequenz vorangestellt ist, die notwendig ist, um den initialen Shift-Zustand wiederherzustellen, und der Konvertierungszustandsparameter *ps wird aktualisiert, um den initialen Shift-Zustand darzustellen.

Wenn c16 nicht die letzte Code-Einheit in einer 16-Bit-Darstellung eines Breitzeichens ist, schreibt die Funktion nicht in das von s angezeigte Array, sondern nur *ps wird aktualisiert.

Wenn das Makro __STDC_UTF_16__ definiert ist, ist die von dieser Funktion verwendete 16-Bit-Kodierung UTF-16; andernfalls ist sie implementierungsabhängig. Das Makro ist immer definiert und die Kodierung ist immer UTF-16.(seit C23) In jedem Fall wird die von dieser Funktion verwendete Multibyte-Zeichen-Kodierung durch die aktuell aktive C-Locale bestimmt.

Inhalt

[bearbeiten] Parameter

s - Zeiger auf das schmale Zeichenarray, in dem das Multibyte-Zeichen gespeichert wird
c16 - das zu konvertierende 16-Bit-Breitzeichen
ps - Zeiger auf das Konvertierungszustandsobjekt, das bei der Interpretation des Multibyte-Strings verwendet wird

[bearbeiten] Rückgabewert

Bei Erfolg gibt die Funktion die Anzahl der Bytes (einschließlich etwaiger Shift-Sequenzen) zurück, die in das Zeichen-Array geschrieben wurden, auf dessen erstes Element s zeigt. Dieser Wert kann 0 sein, z. B. bei der Verarbeitung der führenden char16_t-Einheiten in einer Mehrfach-char16_t-Einheiten-Sequenz (tritt bei der Verarbeitung des führenden Surrogats in einem Surrogatpaar von UTF-16 auf).

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

[bearbeiten] Hinweise

In C11, wie veröffentlicht, kann diese Funktion im Gegensatz zu mbrtoc16, das variable Multibyte-Breitzeichen-Kodierungen (wie UTF-8) in variable 16-Bit-Breitzeichen-Kodierungen (wie UTF-16) konvertiert, nur Einzel-Einheiten-16-Bit-Kodierungen konvertieren, was bedeutet, dass sie UTF-16 nicht in UTF-8 konvertieren kann, obwohl dies die ursprüngliche Absicht dieser Funktion war. Dies wurde durch den Post-C11-Defect-Report DR488 korrigiert.

[bearbeiten] Beispiel

Hinweis: Dieses Beispiel setzt voraus, dass die Korrektur des Defect-Reports DR488 angewendet wurde.
Unter MSVC benötigen Sie möglicherweise das Compiler-Flag /utf-8, damit UTF_8 ordnungsgemäß funktioniert.

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <uchar.h>
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char16_t in[] = u"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    const size_t in_sz = sizeof in / sizeof *in;
 
    printf("Processing %zu UTF-16 code units: [", in_sz);
    for (size_t n = 0; n < in_sz; ++n)
        printf("%s%04X", n ? " " : "", in[n]);
    puts("]");
 
    char* out = malloc(MB_CUR_MAX * in_sz);
    char* p = out;
    mbstate_t state = {0};
 
    for (size_t n = 0; n < in_sz; ++n)
    {
        size_t rc = c16rtomb(p, in[n], &state);
        if (rc == (size_t)-1)
            break;
        p += rc;
    }
 
    size_t out_sz = p - out;
    printf("into %zu UTF-8 code units: [", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%s%02X", x ? " " : "", +(unsigned char)out[x]);
    puts("]");
    free(out);
}

Ausgabe

Processing 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]
into 13 UTF-8 code units: [7A C3 9F E6 B0 B4 ED A0 BC ED BD 8C 00]

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.28.1.2 Die Funktion c16rtomb (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.28.1.2 Die Funktion c16rtomb (S. TBD)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.28.1.2 Die Funktion c16rtomb (S. 399-400)

[bearbeiten] Siehe auch

konvertiert ein schmales Multibyte-Zeichen in UTF-16-Kodierung
(Funktion) [bearbeiten]
C++ Dokumentation für c16rtomb