Namespaces
Variants

std:: codecvt

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

class InternT,
class ExternT,
class StateT

> class codecvt ;

Plantilla de clase std::codecvt encapsula la conversión de cadenas de caracteres, incluyendo anchos y multibyte, de una codificación a otra. Todas las operaciones de E/S de archivo realizadas a través de std:: basic_fstream < CharT > utilizan la faceta std :: codecvt < CharT, char , std:: mbstate_t > de la configuración regional imbucida en el flujo.

cpp/locale/codecvt base cpp/locale/locale/facet std-codecvt-inheritance.svg

Diagrama de herencia

Contenidos

Especializaciones

La biblioteca estándar garantiza proporcionar las siguientes especializaciones (están requeridas para ser implementadas por cualquier objeto locale ):

Definido en el encabezado <locale>
std :: codecvt < char , char , std:: mbstate_t > conversión de identidad
std :: codecvt < char16_t , char , std:: mbstate_t >
(desde C++11) (obsoleto en C++20)
conversión entre UTF-16 y UTF-8
std :: codecvt < char16_t , char8_t, std:: mbstate_t >
(desde C++20) (obsoleto)
conversión entre UTF-16 y UTF-8
std :: codecvt < char32_t , char , std:: mbstate_t >
(desde C++11) (obsoleto en C++20)
conversión entre UTF-32 y UTF-8
std :: codecvt < char32_t , char8_t, std:: mbstate_t >
(desde C++20) (obsoleto)
conversión entre UTF-32 y UTF-8
std :: codecvt < wchar_t , char , std:: mbstate_t > conversión entre los conjuntos de caracteres anchos nativos del sistema y los conjuntos de caracteres estrechos de un solo byte

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

construye un nuevo facet codecvt
(función miembro pública)
invoca do_out
(función miembro pública)
invoca do_in
(función miembro pública)
invoca do_unshift
(función miembro pública)
invoca do_encoding
(función miembro pública)
invoca do_always_noconv
(función miembro pública)
invoca do_length
(función miembro pública)
invoca do_max_length
(función miembro pública)

Funciones miembro protegidas

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

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

Ejemplo

Los siguientes ejemplos leen un archivo UTF-8 usando una configuración regional que implementa conversión UTF-8 en codecvt < wchar_t , char , std:: mbstate_t > y convierte una cadena UTF-8 a UTF-16 usando una de las especializaciones estándar de std::codecvt .

#include <codecvt>
#include <cstdint>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <locale>
#include <string>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
    template<class... Args>
    deletable_facet(Args&&... args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
int main()
{
    // UTF-8 narrow multibyte encoding
    std::string data = reinterpret_cast<const char*>(+u8"z\u00df\u6c34\U0001f34c");
                       // or reinterpret_cast<const char*>(+u8"zß水🍌")
                       // or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9f\x8d\x8c"
    std::ofstream("text.txt") << data;
    // using system-supplied locale's codecvt facet
    std::wifstream fin("text.txt");
    // reading from wifstream will use codecvt<wchar_t, char, std::mbstate_t>
    // this locale's codecvt converts UTF-8 to UCS4 (on systems such as Linux)
    fin.imbue(std::locale("en_US.UTF-8"));
    std::cout << "The UTF-8 file contains the following UCS4 code units:\n" << std::hex;
    for (wchar_t c; fin >> c;)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint32_t>(c) << ' ';
    // using standard (locale-independent) codecvt facet
    std::wstring_convert<
        deletable_facet<std::codecvt<char16_t, char, std::mbstate_t>>, char16_t> conv16;
    std::u16string str16 = conv16.from_bytes(data);
    std::cout << "\n\nThe UTF-8 file contains the following UTF-16 code units:\n"
              << std::hex;
    for (char16_t c : str16)
        std::cout << "U+" << std::setw(4) << std::setfill('0')
                  << static_cast<uint16_t>(c) << ' ';
    std::cout << '\n';
}

Salida:

The UTF-8 file contains the following UCS4 code units:
U+007a U+00df U+6c34 U+1f34c 
The UTF-8 file contains the following UTF-16 code units:
U+007a U+00df U+6c34 U+d83c U+df4c

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 3767 C++20 std :: codecvt < char16_t , char8_t, std:: mbstate_t > y
std :: codecvt < char32_t , char8_t, std:: mbstate_t > son independientes de la configuración regional
se desaconsejó su uso

Véase también

Conversiones de
caracteres
multibyte definido por locale
(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 >
define errores de conversión de caracteres
(clase)
representa el std::codecvt suministrado por el sistema para la configuración regional nombrada
(plantilla de clase)
(C++11) (obsoleto en C++17) (eliminado en C++26)
convierte entre UTF-8 y UCS-2/UCS-4
(plantilla de clase)
(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)