Namespaces
Variants

std:: c32rtomb

From cppreference.net
Definido en el encabezado <cuchar>
std:: size_t c32rtomb ( char * s, char32_t c32, std:: mbstate_t * ps ) ;
(desde C++11)

Convierte un carácter UTF-32 a su representación multibyte estrecha.

Si s no es un puntero nulo, la función determina el número de bytes necesarios para almacenar la representación del carácter multibyte de c32 (incluyendo cualquier secuencia de desplazamiento, y teniendo en cuenta el estado actual de conversión multibyte * ps ), y almacena la representación del carácter multibyte en el arreglo de caracteres cuyo primer elemento está apuntado por s , actualizando * ps según sea necesario. Como máximo MB_CUR_MAX bytes pueden ser escritos por esta función.

Si s es un puntero nulo, la llamada es equivalente a std :: c32rtomb ( buf, U ' \0 ' , ps ) para algún búfer interno buf .

Si c32 es el carácter ancho nulo U ' \0 ' , se almacena un byte nulo, precedido por cualquier secuencia de cambio necesaria para restaurar el estado de cambio inicial y el parámetro de estado de conversión * ps se actualiza para representar el estado de cambio inicial.

La codificación multibyte utilizada por esta función está especificada por la configuración regional de C actualmente activa.

Contenidos

Parámetros

s - puntero al array de caracteres estrechos donde se almacenará el carácter multibyte
c32 - el carácter de 32 bits a convertir
ps - puntero al objeto de estado de conversión utilizado al interpretar la cadena multibyte

Valor de retorno

En caso de éxito, retorna el número de bytes (incluyendo cualquier secuencia de desplazamiento) escritos en el arreglo de caracteres cuyo primer elemento está apuntado por s . Este valor puede ser 0 , por ejemplo, al procesar el primer char32_t en una secuencia multi- char32_t (no ocurre en UTF-32).

En caso de fallo (si c32 no es un carácter de 32 bits válido), retorna - 1 , almacena EILSEQ en errno , y deja * ps en un estado no especificado.

Ejemplo

#include <climits>
#include <clocale>
#include <cuchar>
#include <iomanip>
#include <iostream>
#include <string_view>
int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    std::u32string_view strv = U"zß水🍌"; // or z\u00df\u6c34\U0001F34C
    std::cout << "Processing " << strv.size() << " UTF-32 code units: [ ";
    for (char32_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 (char32_t c : strv)
    {
        std::size_t rc = std::c32rtomb(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";
    }
}

Salida:

Processing 4 UTF-32 code units: [ 0x7a 0xdf 0x6c34 0x1f34c ]
0x7a converted to [ 0x7a ]
0xdf converted to [ 0xc3 0x9f ]
0x6c34 converted to [ 0xe6 0xb0 0xb4 ]
0x1f34c converted to [ 0xf0 0x9f 0x8d 0x8c ]

Véase también

(C++11)
convierte un carácter multibyte estrecho a codificación UTF-32
(función)
[virtual]
convierte una cadena desde InternT a ExternT , como cuando se escribe a archivo
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
Documentación de C para c32rtomb