Namespaces
Variants

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

From cppreference.net
Определено в заголовке <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) Открытая функция-член, вызывает функцию-член do_out самого производного класса.
2) Если данный фасет codecvt определяет преобразование, переводит внутренние символы из исходного диапазона [ from , from_end ) во внешние символы, размещая результаты в последующих позициях, начиная с to . Преобразует не более from_end - from внутренних символов и записывает не более to_end - to внешних символов. Оставляет from_next и to_next указывающими на элемент, следующий за последним успешно преобразованным.

Если этот codecvt фасет не определяет преобразование, символы не преобразуются. to_next устанавливается равным to , state остаётся неизменным, и возвращается std::codecvt_base::noconv .

do_out ( state, from, from + 1 , from_next, to, to_end, to_next ) должен возвращать ok если

  • Этот codecvt фасет используется basic_filebuf , и
  • do_out ( state, from, from_end, from_next, to, to_end, to_next ) вернул бы ok при условии from ! = from_end .

Содержание

Возвращаемое значение

Значение типа std::codecvt_base::result , указывающее статус выполнения следующим образом:

ok преобразование завершено
partial недостаточно места в выходном буфере или неожиданный конец исходного буфера
error встречен символ, который не может быть преобразован
noconv данный аспект является непреобразующим, вывод не записывается

Непреобразующая специализация std:: codecvt < char , char , std:: mbstate_t > всегда возвращает std::codecvt_base::noconv .

Примечания

Требует, чтобы from <= from_end && to <= to_end и чтобы state либо представлял начальное состояние сдвига, либо был получен преобразованием предыдущих символов в последовательности.

В то время как codecvt поддерживает N:M преобразования (например, UTF-16 в UTF-8, где для определения выходных символов могут потребоваться два внутренних символа), std::basic_filebuf может использовать только фацеты codecvt , которые определяют 1:N преобразование, то есть он должен иметь возможность обрабатывать один внутренний символ за раз при записи в файл.

При выполнении преобразований N:M эта функция может возвращать std::codecvt_base::partial после обработки всех исходных символов ( from_next == from_end ). Это означает, что для завершения преобразования требуется ещё один внутренний символ (например, при преобразовании UTF-16 в UTF-8, если последний символ в исходном буфере является старшим суррогатом).

Влияние на state намеренно не определено. В стандартных фасетах он используется для поддержания состояния сдвига, как при вызове std:: wcsrtombs , и поэтому обновляется для отражения состояния сдвига после последнего успешно преобразованного символа, но пользовательская фасета может свободно использовать его для поддержания любого другого состояния, например, для подсчета количества встреченных специальных символов.

Пример

#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ß水🍌"
    // примечание: следующее можно сделать с помощью wstring_convert
    std::mbstate_t mb{}; // начальное состояние сдвига
    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);
    // проверка ошибок пропущена для краткости
    external.resize(to_next - &external[0]);
    std::cout << "The string in narrow multibyte encoding: " << external << '\n';
}

Вывод:

The string in narrow multibyte encoding: zß水🍌

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 76 C++98 было неясно, требуется ли преобразование
для поддержки обработки по одному внутреннему символу за раз
требуется только при использовании
классом basic_filebuf

Смотрите также

[virtual]
записывает символы в связанный файл из области вывода
(виртуальная защищенная функция-член std::basic_filebuf<CharT,Traits> )
преобразует широкую строку в байтовую строку
(публичная функция-член std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc> )
преобразует широкую строку в узкую многобайтовую строку с учетом состояния
(функция)
[virtual]
преобразует строку из ExternT в InternT , например, при чтении из файла
(виртуальная защищенная функция-член)