std::codecvt<InternT,ExternT,StateT>:: out, do_out
|
Определено в заголовке
<locale>
|
||
|
public
:
result out
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_out
(
StateT
&
state,
|
(2) | |
do_out
самого производного класса.
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
, например, при чтении из файла
(виртуальная защищенная функция-член) |