Namespaces
Variants

std::codecvt<InternT,ExternT,StateT>:: out, do_out

From cppreference.net
Definido en el encabezado <locale>
public :

result out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(1)
protected :

virtual result do_out ( StateT & state,
const InternT * from,
const InternT * from_end,
const InternT * & from_next,
ExternT * to,
ExternT * to_end,

ExternT * & to_next ) const ;
(2)
1) Función miembro pública, llama a la función miembro do_out de la clase más derivada.
2) Si esta faceta codecvt define una conversión, traduce los caracteres internos del rango fuente [ from , from_end ) a caracteres externos, colocando los resultados en las ubicaciones subsiguientes comenzando en to . Convierte no más de from_end - from caracteres internos y escribe no más de to_end - to caracteres externos. Deja from_next y to_next apuntando justo después del último elemento convertido exitosamente.

Si este facet codecvt no define una conversión, no se convierten caracteres. to_next se establece igual a to , state permanece sin cambios, y se retorna std::codecvt_base::noconv .

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) debe retornar ok si

  • este codecvt facet es utilizado por basic_filebuf , y
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) retornaría ok donde from ! = from_end .

Contenidos

Valor de retorno

Un valor de tipo std::codecvt_base::result , que indica el estado de éxito de la siguiente manera:

ok conversión completada
partial espacio insuficiente en el buffer de salida o fin inesperado del buffer de origen
error se encontró un carácter que no pudo ser convertido
noconv esta faceta no convierte, no se escribió ninguna salida

La especialización no convertidora std:: codecvt < char , char , std:: mbstate_t > siempre retorna std::codecvt_base::noconv .

Notas

Requiere que from <= from_end && to <= to_end y que state represente ya sea el estado de desplazamiento inicial o se haya obtenido convirtiendo los caracteres precedentes en la secuencia.

Mientras que codecvt admite conversiones N:M (por ejemplo, UTF-16 a UTF-8, donde pueden ser necesarios dos caracteres internos para decidir qué caracteres externos generar), std::basic_filebuf solo puede utilizar facetas codecvt que definan una conversión 1:N, es decir, debe poder procesar un carácter interno a la vez al escribir en un archivo.

Al realizar conversiones N:M, esta función puede retornar std::codecvt_base::partial después de consumir todos los caracteres fuente ( from_next == from_end ). Esto significa que se necesita otro carácter interno para completar la conversión (por ejemplo, al convertir UTF-16 a UTF-8, si el último carácter en el búfer fuente es un sustituto alto).

El efecto sobre state está deliberadamente sin especificar. En facetas estándar, se utiliza para mantener el estado de desplazamiento como al llamar std:: wcsrtombs , y por lo tanto se actualiza para reflejar el estado de desplazamiento después del último carácter convertido exitosamente, pero una faceta definida por el usuario es libre de usarlo para mantener cualquier otro estado, por ejemplo, contar el número de caracteres especiales encontrados.

Ejemplo

#include <iostream>
#include <locale>
#include <string>
int main()
{
    std::locale::global(std::locale("en_US.utf8"));
    auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(std::locale());
    std::wstring internal = L"z\u00df\u6c34\U0001f34c"; // L"zß水🍌"
    // nota que lo siguiente puede hacerse con wstring_convert
    std::mbstate_t mb{}; // estado de desplazamiento inicial
    std::string external(internal.size() * f.max_length(), '\0'); 
    const wchar_t* from_next;
    char* to_next;
    f.out(mb, &internal[0], &internal[internal.size()], from_next,
              &external[0], &external[external.size()], to_next);
    // comprobación de errores omitida por brevedad
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

Salida:

The string in narrow multibyte encoding: zß水🍌

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 76 C++98 no estaba claro si la conversión es requerida
para soportar tomar un carácter interno a la vez
solo requerida si es utilizada
por basic_filebuf

Véase también

[virtual]
escribe caracteres al archivo asociado desde el área de escritura
(función miembro protegida virtual de std::basic_filebuf<CharT,Traits> )
convierte una cadena ancha en una cadena de bytes
(función miembro pública de std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
convierte una cadena ancha a cadena de caracteres multibyte estrecha, dado un estado
(función)
[virtual]
convierte una cadena de ExternT a InternT , como cuando se lee desde un archivo
(función miembro protegida virtual)