std::codecvt<InternT,ExternT,StateT>:: out, do_out
|
Défini dans l'en-tête
<locale>
|
||
|
public
:
result out
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_out
(
StateT
&
state,
|
(2) | |
do_out
de la classe la plus dérivée.
codecvt
définit une conversion, traduit les caractères internes de la plage source
[
from
,
from_end
)
en caractères externes, plaçant les résultats dans les emplacements suivants commençant à
to
. Convertit au plus
from_end
-
from
caractères internes et écrit au plus
to_end
-
to
caractères externes. Laisse
from_next
et
to_next
pointant juste après le dernier élément converti avec succès.
Si cette facette
codecvt
ne définit pas de conversion, aucun caractère n'est converti.
to_next
est défini comme étant égal à
to
,
state
reste inchangé, et
std::codecvt_base::noconv
est retourné.
do_out
(
state, from, from
+
1
, from_next, to, to_end, to_next
)
doit retourner
ok
si
-
cette facette
codecvtest utilisée par basic_filebuf , et -
do_out
(
state, from, from_end, from_next, to, to_end, to_next
)
retournerait
oklorsque from ! = from_end .
Table des matières |
Valeur de retour
Une valeur de type std::codecvt_base::result , indiquant le statut de réussite comme suit :
ok
|
conversion terminée |
partial
|
espace insuffisant dans le tampon de sortie ou fin inattendue du tampon source |
error
|
caractère rencontré ne pouvant être converti |
noconv
|
cette facette est non-convertissante, aucune sortie écrite |
La spécialisation non-convertissante std:: codecvt < char , char , std:: mbstate_t > retourne toujours std::codecvt_base::noconv .
Notes
Requiert que from <= from_end && to <= to_end et que state représente soit l'état de décalage initial, soit soit obtenu en convertissant les caractères précédents dans la séquence.
Bien que
codecvt
prenne en charge les conversions N:M (par exemple UTF-16 vers UTF-8, où deux caractères internes peuvent être nécessaires pour décider quels caractères externes produire),
std::basic_filebuf
ne peut utiliser que les facettes
codecvt
qui définissent une conversion 1:N, c'est-à-dire qu'il doit être capable de traiter un caractère interne à la fois lors de l'écriture dans un fichier.
Lors de conversions N:M, cette fonction peut renvoyer std::codecvt_base::partial après avoir consommé tous les caractères source ( from_next == from_end ). Cela signifie qu'un autre caractère interne est nécessaire pour compléter la conversion (par exemple lors de la conversion UTF-16 vers UTF-8, si le dernier caractère dans le tampon source est une unité de code haute).
L'effet sur state est délibérément non spécifié. Dans les facettes standards, il est utilisé pour maintenir l'état de décalage comme lors de l'appel à std:: wcsrtombs , et est donc mis à jour pour refléter l'état de décalage après le dernier caractère converti avec succès, mais une facette définie par l'utilisateur est libre de l'utiliser pour maintenir tout autre état, par exemple compter le nombre de caractères spéciaux rencontrés.
Exemple
#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ß水🍌" // note that the following can be done with wstring_convert std::mbstate_t mb{}; // état de décalage initial 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); // vérification d'erreur omise pour la brièveté external.resize(to_next - &external[0]); std::cout << "The string in narrow multibyte encoding: " << external << '\n'; }
Sortie :
The string in narrow multibyte encoding: zß水🍌
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement tel que publié | Comportement correct |
|---|---|---|---|
| LWG 76 | C++98 |
il n'était pas clair si la conversion est requise
pour supporter la prise d'un caractère interne à la fois |
requis uniquement si utilisé
par basic_filebuf |
Voir aussi
|
[virtual]
|
écrit des caractères dans le fichier associé depuis la zone de mise en mémoire tampon
(fonction membre protégée virtuelle de
std::basic_filebuf<CharT,Traits>
)
|
|
convertit une chaîne large en chaîne d'octets
(fonction membre publique de
std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>
)
|
|
|
convertit une chaîne large en chaîne de caractères multioctets étroite, avec état donné
(fonction) |
|
|
[virtual]
|
convertit une chaîne de
ExternT
vers
InternT
, comme lors de la lecture depuis un fichier
(fonction membre protégée virtuelle) |