Namespaces
Variants

std:: codecvt_utf16

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_utf16

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

std::codecvt_utf16 es una faceta de std::codecvt que encapsula la conversión entre una cadena de bytes codificada en UTF-16 y una cadena de caracteres UCS-2 o UTF-32 (dependiendo del tipo de Elem ). Esta std::codecvt faceta puede utilizarse para leer y escribir archivos UTF-16 en modo binario.

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_utf16
(función miembro pública)
(destructor)
destruye un facet codecvt_utf16
(función miembro pública)

std::codecvt_utf16:: codecvt_utf16

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

Construye un nuevo facet std::codecvt_utf16 , 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_utf16:: ~codecvt_utf16

~codecvt_utf16 ( ) ;

Destruye el facet. A diferencia de los facets gestionados por locale, el destructor de este facet 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 el facet 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 buffer 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, haciendo de esta una configuración regional no convertidora. El término "UCS-2" fue desaprobado y eliminado de ISO 10646.

Ejemplo

El siguiente ejemplo demuestra la decodificación de un archivo UTF-16le en un sistema con wchar_t de 32 bits. En un sistema con wchar_t de 16 bits, la decodificación del tercer carácter fallará porque std :: codecvt_utf16 < char16_t > produce UCS-2, no UTF-16.

#include <codecvt>
#include <cwchar>
#include <fstream>
#include <iostream>
#include <locale>
#include <string>
void prepare_file()
{
    // UTF-16le data (if host system is little-endian)
    char16_t utf16le[4] = {0x007a,          // latin small letter 'z' U+007a
                           0x6c34,          // CJK ideograph "water"  U+6c34
                           0xd834, 0xdd0b}; // musical sign segno U+1d10b    
    // store in a file
    std::ofstream fout("text.txt");
    fout.write(reinterpret_cast<char*>(utf16le), sizeof utf16le);
}
int main()
{
    prepare_file();
    // open as a byte stream
    std::wifstream fin("text.txt", std::ios::binary);
    // apply facet
    fin.imbue(std::locale(fin.getloc(),
        new std::codecvt_utf16<wchar_t, 0x10ffff, std::little_endian>));
    wchar_t c = 0;
    for (std::cout << std::showbase << std::hex; fin.get(c);
         std::cout << static_cast<std::wint_t>(c) << '\n');
}

Salida:

0x7a
0x6c34
0x1d10b

Informes de defectos

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

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-8 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)