std::codecvt<InternT,ExternT,StateT>:: in, std::codecvt<InternT,ExternT,StateT>:: do_in
|
Определено в заголовке
<locale>
|
||
|
public
:
result in
(
StateT
&
state,
|
(1) | |
|
protected
:
virtual
result do_in
(
StateT
&
state,
|
(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"; // или u8"zß水𝄋" // или "\x7a\xc3\x9f\xe6\xb0\xb4\xf0\x9d\x84\x8b" // примечание: следующее может быть выполнено с помощью wstring_convert std::mbstate_t mb = std::mbstate_t(); // начальное состояние сдвига 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); // проверка ошибок пропущена для краткости internal.resize(to_next - &internal[0]); std::wcout << L"The string in wide encoding: " << internal << '\n'; }
Вывод:
The string in wide encoding: zß水𝄋
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 76 | C++98 |
было неясно, требуется ли преобразование
для поддержки генерации одного внутреннего символа за раз |
требуется только при использовании
в basic_filebuf |
Смотрите также
|
[virtual]
|
читает из связанного файла
(виртуальная защищенная функция-член
std::basic_filebuf<CharT,Traits>
)
|
|
преобразует байтовую строку в широкую строку
(публичная функция-член
std::wstring_convert<Codecvt,Elem,Wide_alloc,Byte_alloc>
)
|
|
|
преобразует узкую многобайтовую строку символов в широкую строку с учетом состояния
(функция) |
|
|
[virtual]
|
преобразует строку из
InternT
в
ExternT
, например, при записи в файл
(виртуальная защищенная функция-член) |