std::codecvt<InternT,ExternT,StateT>::in, std::codecvt<InternT,ExternT,StateT>::do_in
Определён в заголовочном файле <locale> | ||
|---|---|---|
public:
result in( StateT& state,
const ExternT* from,
const ExternT* from_end,
const ExternT*& from_next,
InternT* to,
InternT* to_end,
InternT*& to_next ) const;
| (1) | |
protected:
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;
| (2) |
do_in наиболее производного класса.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_in(state, from, from_end, from_next, to, to + 1, to_next) должен возвращать ok, если
- этот аспект
codecvtиспользуется вbasic_filebuf, и -
do_in(state, from, from_end, from_next, to, to_end, to_next)возвращал быok, когдаto != to_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 представляли начальное состояние сдвига или были получены преобразованием предшествующих символов последовательности.
Воздействие на state намеренно не специфицировано. В стандартных аспектах оно используется для поддержания состояния сдвига, например при вызове std::mbsrtowcs, и поэтому обновляется так, чтобы отражать состояние преобразования после последнего обработанного внешнего символа. Однако пользовательский аспект может использовать его для поддержания любого другого состояния, например для подсчёта количества встреченных специальных символов.
Пример
#include <iostream>
#include <locale>
#include <string>
int main()
{
std::locale::global(std::locale("en_US.utf8"));
auto const& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>
(std::locale());
std::string external = "z\u00df\u6c34\U0001d10b"; // or u8"zß水𝄋"
// or "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b"
// note that the following can be done with wstring_convert
std::mbstate_t mb = std::mbstate_t(); // initial shift state
std::wstring internal(external.size(), '\0');
const char* from_next;
wchar_t* to_next;
f.in(mb, &external[0], &external[external.size()], from_next,
&internal[0], &internal[internal.size()], to_next);
// error checking skipped for brevity
internal.resize(to_next - &internal[0]);
std::wcout << L"The string in wide encoding: " << internal << '\n';
}
Вывод:
The string in wide encoding: zß水𝄋
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были ретроспективно применены к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 76 | C++98 | не было ясно, требуется ли поддержка преобразования с выдачей одного внутреннего символа за раз | требуется только при использовании в basic_filebuf |
См. также
|
[виртуальная] | читает из связанного файла (виртуальная защищённая функция-член класса std::basic_filebuf<CharT,Traits>) |
| преобразует строку байтов в широкую строку (открытая функция-член класса std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>) |
|
| преобразует узкую многобайтовую строку символов в широкую строку с учётом состояния (функция) |
|
|
[виртуальная] | преобразует строку из InternT в ExternT, например при записи в файл (виртуальная защищённая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/codecvt/in