Namespaces
Variants

std:: codecvt_utf8

From cppreference.net
Definido en el encabezado <codecvt>
template <

class Elem,
unsigned long Maxcode = 0x10ffff ,
std:: codecvt_mode Mode = ( std:: codecvt_mode ) 0 >
class codecvt_utf8

: public std:: codecvt < Elem, char , std:: mbstate_t > ;
(desde C++11)
(obsoleto en C++17)
(eliminado en C++26)

std::codecvt_utf8 es una faceta std::codecvt que encapsula la conversión entre una cadena de bytes codificada en UTF-8 y una cadena de caracteres UCS-2 o UTF-32 (dependiendo del tipo de Elem ). Esta faceta std::codecvt puede utilizarse para leer y escribir archivos UTF-8, tanto de texto como binarios.

UCS-2 es una codificación arcaica que es un subconjunto de UTF-16, que codifica valores escalares únicamente en el rango U+0000-U+FFFF (Plano Multilingüe Básico).

Contenidos

Parámetros de Plantilla

Elem - ya sea char16_t , char32_t , o wchar_t
Maxcode - el valor más grande de Elem que esta faceta leerá o escribirá sin error
Mode - una constante de tipo std::codecvt_mode

Funciones miembro

(constructor)
construye un nuevo facet codecvt_utf8
(función miembro pública)
(destructor)
destruye un facet codecvt_utf8
(función miembro pública)

std::codecvt_utf8:: codecvt_utf8

explicit codecvt_utf8 ( std:: size_t refs = 0 ) ;

Construye un nuevo facet std::codecvt_utf8 , pasa el contador de referencias inicial refs a la clase base.

Parámetros

refs - el número de referencias que enlazan al facet

std::codecvt_utf8:: ~codecvt_utf8

~codecvt_utf8 ( ) ;

Destruye la faceta. A diferencia de las facetas gestionadas por la configuración regional, el destructor de esta faceta es público.

Heredado de std:: codecvt

Tipos anidados

Tipo Definición
intern_type internT
extern_type externT
state_type stateT

Miembros de datos

Miembro Descripción
std::locale::id id [static] el identificador del facet

Funciones miembro

invoca do_out
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_in
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_unshift
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_encoding
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_always_noconv
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_length
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )
invoca do_max_length
(función miembro pública de std::codecvt<InternT,ExternT,StateT> )

Funciones miembro protegidas

[virtual]
convierte una cadena de InternT a ExternT , como al escribir en un archivo
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
[virtual]
convierte una cadena de ExternT a InternT , como al leer de un archivo
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
[virtual]
genera la secuencia de caracteres de terminación de ExternT para conversión incompleta
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
[virtual]
retorna el número de caracteres ExternT necesarios para producir un carácter InternT , si es constante
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
prueba si la faceta codifica una conversión de identidad para todos los valores de argumento válidos
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
[virtual]
calcula la longitud de la cadena ExternT que sería consumida por conversión en el búfer InternT dado
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )
[virtual]
retorna el número máximo de caracteres ExternT que podrían convertirse en un solo carácter InternT
(función miembro protegida virtual de std::codecvt<InternT,ExternT,StateT> )

Heredado de std:: codecvt_base

Tipo anidado Definición
enum result { ok, partial, error, noconv } ; Tipo de enumeración no delimitada
Constante de enumeración Definición
ok la conversión se completó sin errores
partial no todos los caracteres fuente fueron convertidos
error se encontró un carácter inválido
noconv no se requiere conversión, los tipos de entrada y salida son iguales

Notas

Aunque el estándar requiere que esta faceta funcione con UCS-2 cuando el tamaño de Elem es de 16 bits, algunas implementaciones utilizan UTF-16 en su lugar. El término "UCS-2" fue desaprobado y eliminado de ISO 10646.

Ejemplo

El siguiente ejemplo demuestra la diferencia entre las conversiones UCS-2/UTF-8 y UTF-16/UTF-8: el tercer carácter en la cadena no es un carácter UCS-2 válido.

#include <codecvt>
#include <cstdint>
#include <iostream>
#include <locale>
#include <string>
int main()
{
    // UTF-8 data. The character U+1d10b, musical sign segno, does not fit in UCS-2
    std::string utf8 = "z\u6c34\U0001d10b";
    // the UTF-8 / UTF-16 standard conversion facet
    std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> utf16conv;
    std::u16string utf16 = utf16conv.from_bytes(utf8);
    std::cout << "UTF-16 conversion produced " << utf16.size() << " code units:\n"
              << std::showbase << std::hex;
    for (char16_t c : utf16)
        std::cout << static_cast<std::uint16_t>(c) << ' ';
    // the UTF-8 / UCS-2 standard conversion facet
    std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;
    try
    {
        std::u16string ucs2 = ucs2conv.from_bytes(utf8);
    }
    catch(const std::range_error& e)
    {
        std::u16string ucs2 = ucs2conv.from_bytes(utf8.substr(0, ucs2conv.converted()));
        std::cout << "\nUCS-2 failed after producing " << std::dec << ucs2.size()
                  << " characters:\n" << std::showbase << std::hex;
        for (char16_t c : ucs2)
            std::cout << static_cast<std::uint16_t>(c) << ' ';
        std::cout << '\n';
    }
}

Salida:

UTF-16 conversion produced 4 code units:
0x7a 0x6c34 0xd834 0xdd0b
UCS-2 failed after producing 2 characters:
0x7a 0x6c34

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2229 C++98 el constructor y destructor no estaban especificados los especifica

Véase también

Conversiones de caracteres
multibyte definido por localización
(UTF-8, GB18030)
UTF-8
UTF-16
UTF-16 mbrtoc16 / c16rtomb (con DR488 de C11)

codecvt < char16_t , char ,mbstate_t >
codecvt_utf8_utf16 < char16_t >
codecvt_utf8_utf16 < char32_t >
codecvt_utf8_utf16 < wchar_t >

N/A
UCS-2 c16rtomb (sin DR488 de C11) codecvt_utf8 < char16_t > codecvt_utf16 < char16_t >
UTF-32

mbrtoc32 / c32rtomb

codecvt < char32_t , char ,mbstate_t >
codecvt_utf8 < char32_t >

codecvt_utf16 < char32_t >

system wchar_t :

UTF-32 (no Windows)
UCS-2 (Windows)

mbsrtowcs / wcsrtombs
use_facet < codecvt
< wchar_t , char ,mbstate_t >> ( locale )

codecvt_utf8 < wchar_t > codecvt_utf16 < wchar_t >
convierte entre codificaciones de caracteres, incluyendo UTF-8, UTF-16, UTF-32
(plantilla de clase)
(C++11) (obsoleto en C++17) (eliminado en C++26)
etiquetas para alterar el comportamiento de las facetas codecvt estándar
(enumeración)
(C++11) (obsoleto en C++17) (eliminado en C++26)
convierte entre UTF-16 y UCS-2/UCS-4
(plantilla de clase)
(C++11) (obsoleto en C++17) (eliminado en C++26)
convierte entre UTF-8 y UTF-16
(plantilla de clase)