std:: codecvt
|
Definido en el encabezado
<locale>
|
||
|
template
<
class
InternT,
|
||
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.
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) |
|
[virtual]
|
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
>
|
N/A |
| UCS-2 | c16rtomb (sin DR488 de C11) | codecvt_utf8 < char16_t > | codecvt_utf16 < char16_t > |
| UTF-32 |
codecvt
<
char32_t
,
char
,mbstate_t
>
|
codecvt_utf16 < char32_t > |
|
|
system
wchar_t
:
UTF-32
(no Windows)
|
mbsrtowcs
/
wcsrtombs
|
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) |