namespace std { class codecvt_base { public: enum result { ok, partial, error, noconv }; }; template <class internT, class externT, class stateT> class codecvt : public locale::facet, public codecvt_base { public: using intern_type = internT; using extern_type = externT; using state_type = stateT; explicit codecvt(size_t refs = 0); result out( stateT& state, const internT* from, const internT* from_end, const internT*& from_next, externT* to, externT* to_end, externT*& to_next) const; result unshift( stateT& state, externT* to, externT* to_end, externT*& to_next) const; result in( stateT& state, const externT* from, const externT* from_end, const externT*& from_next, internT* to, internT* to_end, internT*& to_next) const; int encoding() const noexcept; bool always_noconv() const noexcept; int length(stateT&, const externT* from, const externT* end, size_t max) const; int max_length() const noexcept; static locale::id id; protected: ~codecvt(); 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; virtual result do_in( stateT& state, const externT* from, const externT* from_end, const externT*& from_next, internT* to, internT* to_end, internT*& to_next) const; virtual result do_unshift( stateT& state, externT* to, externT* to_end, externT*& to_next) const; virtual int do_encoding() const noexcept; virtual bool do_always_noconv() const noexcept; virtual int do_length(stateT&, const externT* from, const externT* end, size_t max) const; virtual int do_max_length() const noexcept; }; }
Класс codecvt<internT, externT, stateT> предназначен для использования при преобразовании из одной кодировки символов в другую, например, из широких символов в многобайтовые символы или между кодировками широких символов, такими как Unicode и EUC.
Специализации, требуемые в Table69 ([locale.category]), преобразуют собственный набор символов, определенный реализацией. codecvt<char, char, mbstate_t> реализует вырожденное преобразование; он вообще не конвертируется. Специализацияcodecvt<char16_t, char, mbstate_t> преобразуется между формами кодирования UTF-16 и UTF-8, а специализацияcodecvt<char32_t, char, mbstate_t> преобразуется между формами кодирования UTF-32 и UTF-8. codecvt<wchar_t, char, mbstate_t> преобразует собственные наборы символов для узких и широких символов. Специализации по mbstate_t выполнению преобразования между кодировками, известные разработчику библиотеки. Другие кодировки можно преобразовать, специализируясь на определяемом пользователем stateT типе. Объекты типа stateT могут содержать любое состояние, которое полезно для связи со специализированнымиdo_in или do_out членами или от них .
result out(
stateT& state,
const internT* from, const internT* from_end, const internT*& from_next,
externT* to, externT* to_end, externT*& to_next) const;
result unshift(stateT& state, externT* to, externT* to_end, externT*& to_next) const;
result in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
int encoding() const noexcept;
bool always_noconv() const noexcept;
int length(stateT& state, const externT* from, const externT* from_end, size_t max) const;
int max_length() const noexcept;
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;
result do_in(
stateT& state,
const externT* from, const externT* from_end, const externT*& from_next,
internT* to, internT* to_end, internT*& to_next) const;
Requires: (from <= from_end && to <= to_end) четко определенные и true; state инициализируется, если оно находится в начале последовательности, или равно результату преобразования предыдущих символов в последовательности.
Effects: Переводит символы в исходном диапазоне [from, from_end), помещая результаты в последовательные позиции, начиная с места назначенияto. Преобразует не более (from_end - from) элементов источника и сохраняет не более (to_end - to) элементов назначения.
Останавливается, если встречает персонажа, которого не может преобразовать. Он всегда оставляетfrom_next иto_next указатели , указывающие один за последним элементом успешно конвертированы. Если возвращает noconv, internT и externT имеют тот же тип, а преобразованная последовательность идентична входной последовательности [from, from_next). to_next установлен равнымto, значениеstate не изменяется, и нет никаких изменений в значениях в [to, to_end).
codecvt Фаска , который используется basic_filebuf ([file.streams]) должна обладать свойством , что если
do_out(state, from, from_end, from_next, to, to_end, to_next)
вернется ok, где from != from_endтогда
do_out(state, from, from + 1, from_next, to, to_end, to_next)
также вернется ok, и что если
do_in(state, from, from_end, from_next, to, to_end, to_next)
вернется ok, где to != to_endтогда
do_in(state, from, from_end, from_next, to, to + 1, to_next)
также вернемся ok.236 [ Note: В результате операций сstateон может возвращатьok илиpartial и устанавливатьfrom_next == from иto_next != to. ] — end note
Remarks: Его операции неstate указаны. [ Note: Этот аргумент может использоваться, например, для поддержания состояния сдвига, для указания параметров преобразования (например, только счетчик) или для идентификации кэша смещений поиска. ] — end note
Returns: Значение перечисления, как показано в Табл71.
Ценить | Имея в виду |
ok | завершил преобразование |
partial | не все исходные символы преобразованы |
error | обнаружил символ,[from, from_end) который не может преобразовать |
noconv | internT иexternT одного типа, а входная последовательность идентична преобразованной последовательности |
Возвращаемое значение partialif (from_next == from_end)указывает, что либо целевая последовательность не поглотила все доступные элементы назначения, либо необходимы дополнительные исходные элементы, прежде чем можно будет создать другой элемент назначения.
result do_unshift(stateT& state, externT* to, externT* to_end, externT*& to_next) const;
Requires: (to <= to_end) четко очерченный иtrue; состояние инициализировано, если оно находится в начале последовательности, или равно результату преобразования предыдущих символов в последовательности.
Effects: Знаки, начинающиеся сto этого места, должны быть добавлены для завершения последовательности, когда текущее значение stateT задаетсяstate.237 Сохраняет не более (to_end - to) элементов назначения и оставляетto_next указатель, указывающий на один за последним успешно сохраненным элементом.
Returns: Значение перечисления, как показано в Табл72.
Ценить | Имея в виду |
ok | завершил последовательность |
partial | пространство для более чемto_end - to целевых элементов требовалось для завершения последовательности с учетом значенияstate |
error | произошла неопределенная ошибка |
noconv | для этого не требуется прекращенияstate_type |
int do_encoding() const noexcept;
bool do_always_noconv() const noexcept;
Returns: true если do_in() и do_out() вернуться noconv для всех допустимых значений аргументов. codecvt<char, char, mbstate_t> возвращается true.
int do_length(stateT& state, const externT* from, const externT* from_end, size_t max) const;
Requires: (from <= from_end) четко определенные и true; state инициализируется, если оно находится в начале последовательности, или равно результату преобразования предыдущих символов в последовательности.
Effects: Влияние наstate аргумент «как будто» она называется do_in(state, from, from_end, from, to, to+max, to) дляto указывая на буфер , по крайней мереmax элементов.
Returns: (from_next-from) где from_next - наибольшее значение в диапазоне, [from, from_end] такое, что последовательность значений в диапазоне [from, from_next) представляет max или меньше допустимых полных символов типа internT. Специализация codecvt<char, char, mbstate_t>возвращает меньшее из значений max и (from_end-from).
int do_max_length() const noexcept;
Returns: Максимальное значение, которое do_length(state, from, from_end, 1) может быть возвращено для любого допустимого диапазона [from, from_end) и stateT значения state. Специализация codecvt<char, char, mbstate_t>::do_max_length() возвращает 1.
Неформально это означает, что basic_filebuf предполагается, что отображение внутренних символов на внешние - от 1 до N: codecvt фасет, который используется, basic_filebuf должен иметь возможность переводить символы по одному внутреннему символу за раз.
Обычно это символы, в которые нужно вернуть состояние stateT().
Еслиencoding() уступает-1, тоmax_length()externT при создании одногоinternT символа может быть использовано больше элементов , а дополнительные externT элементы могут появиться в конце последовательности после тех, которые дают последнийinternT символ.