std::codecvt<InternT,ExternT,StateT>:: out, do_out
|
Definido en el encabezado
<locale>
|
||
|
public
:
result out
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_out
(
StateT
&
state,
|
(2) | |
do_out
de la clase más derivada.
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
codecvtfacet es utilizado por basic_filebuf , y -
do_out
(
state, from, from_end, from_next, to, to_end, to_next
)
retornaría
okdonde 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) |