| std::codecvt::out,do_out(3) | C++ Standard Libary | std::codecvt::out,do_out(3) | 
NAME¶
std::codecvt::out,do_out - std::codecvt::out,do_out
Synopsis¶
 Defined in header <locale>
  
   public:
  
   result out( StateT& state,
  
   const InternT* from,
  
   const InternT* from_end, (1)
  
   const InternT*& from_next,
  
   ExternT* to,
  
   ExternT* to_end,
  
   ExternT*& to_next ) const;
  
   protected:
  
   virtual result do_out( StateT& state,
  
   const InternT* from,
  
   const InternT* from_end, (2)
  
   const InternT*& from_next,
  
   ExternT* to,
  
   ExternT* to_end,
  
   ExternT*& to_next ) const;
  
   1) Public member function, calls the member function do_out of the most
    derived
  
   class.
  
   2) If this codecvt facet defines a conversion, translates the internal
    characters
  
   from the source range [from, from_end) to external characters, placing the
    results
  
   in the subsequent locations starting at to. Converts no more than from_end -
    from
  
   internal characters and writes no more than to_end - to external characters.
    Leaves
  
   from_next and to_next pointing one beyond the last element successfully
    converted.
  
   If this codecvt facet does not define a conversion, no characters are
    converted.
  
   to_next is set to be equal to to, state is unchanged, and
    std::codecvt_base::noconv
  
   is returned.
  
   do_out(state, from, from + 1, from_next, to, to_end, to_next) must return ok
    if
  
   * this codecvt facet is used by basic_filebuf, and
  
   * do_out(state, from, from_end, from_next, to, to_end, to_next) would return
    ok
  
   where from != from_end.
Return value¶
A value of type std::codecvt_base::result, indicating the success status as follows:
  
   ok conversion completed
  
   partial not enough space in the output buffer or unexpected end of source
    buffer
  
   error encountered a character that could not be converted
  
   noconv this facet is non-converting, no output written
  
   The non-converting specialization std::codecvt<char, char,
    std::mbstate_t> always
  
   returns std::codecvt_base::noconv.
Notes¶
 Requires that from <= from_end && to <= to_end and
    that state either representing
  
   the initial shift state or obtained by converting the preceding characters in
    the
  
   sequence.
  
   While codecvt supports N:M conversions (e.g. UTF-16 to UTF-8, where two
    internal
  
   characters may be necessary to decide what external characters to output),
  
   std::basic_filebuf can only use codecvt facets that define a 1:N conversion,
    that is
  
   it must be able to process one internal character at a time when writing to a
    file.
  
   When performing N:M conversions, this function may return
    std::codecvt_base::partial
  
   after consuming all source characters (from_next == from_end). This means
    that
  
   another internal character is needed to complete the conversion (e.g. when
  
   converting UTF-16 to UTF-8, if the last character in the source buffer is a
    high
  
   surrogate).
  
   The effect on state is deliberately unspecified. In standard facets, it is
    used to
  
   maintain shift state like when calling std::wcsrtombs, and is therefore
    updated to
  
   reflect the shift state after the last successfully converted character, but
    a
  
   user-defined facet is free to use it to maintain any other state, e.g. count
    the
  
   number of special characters encountered.
Example¶
// Run this code
  
   #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{}; // initial shift state
  
   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);
  
   // error checking skipped for brevity
  
   external.resize(to_next - &external[0]);
  
   std::cout << "The string in narrow multibyte encoding: "
    << external << '\n';
  
   }
Output:¶
The string in narrow multibyte encoding: zß水🍌
  
   Defect reports
  
   The following behavior-changing defect reports were applied retroactively to
  
   previously published C++ standards.
  
   DR Applied to Behavior as published Correct behavior
  
   it was unclear whether the conversion is
  
   LWG 76 C++98 required only required if used
  
   to support taking one internal character at by basic_filebuf
  
   a time
See also¶
 overflow writes characters to the associated file from the put
    area
  
   [virtual] (virtual protected member function of
    std::basic_filebuf<CharT,Traits>)
  
   converts a wide string into a byte string
  
   to_bytes (public member function of
  
   std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>)
  
   wcsrtombs converts a wide string to narrow multibyte character string,
    given state
  
   (function)
  
   do_in converts a string from ExternT to InternT, such as when reading from
    file
  
   [virtual] (virtual protected member
    function)
| 2024.06.10 | http://cppreference.com |