Spec-Zone.ru › C++

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)
1) Открытая функция-член, вызывает функцию-член do_in наиболее производного класса.
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_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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/codecvt/in

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API