#include <iconv.h> size_t iconv(iconv_t cd, char **inbuf, size_t *inbytesleft, char **outbuf, size_t *outbytesleft);
Основным случаем работы функции является ситуация, когда inbuf не равно NULL и *inbuf не равно NULL. В этом случае функция iconv преобразует многобайтовую последовательность, начиная с *inbuf, в многобайтовую последовательность, начиная с *outbuf. Максимальное количество считанных байтов будет равно *inbytesleft, начиная с *inbuf. Максимальное количество записанных байтов будет равно *outbytesleft, начиная с *outbuf.
Функция iconv преобразует один за другим символы последовательности и после каждого преобразования увеличивает *inbuf и уменьшает *inbytesleft на количество измененных байтов, увеличивает *outbuf и уменьшает *outbytesleft на количество измененных байтов, обновляет статус процесса перекодировки, указанный в cd. Процесс перекодировки прерывается в четырех случаях:
1. Для обработки представлена неправильная многобайтная последовательность. В этом случае переменная errno устанавливается равной EILSEQ и возвращает (size_t)(-1). *inbuf не меняется, указывая на начало неправильной последовательности.
2. Входящая последовательность байтов была полностью перекодирована, то есть *inbytesleft уменьшилось до нуля. В этом случае iconv возвращает количество необратимых преобразований, выполненных функцией во время работы.
3. Функции на входе для обработки была предоставлена короткая (неполная) последовательность, и процесс перекодирования был остановлен после обработки данной последовательности. В этом случае переменная errno устанавливается равной EINVAL и возвращает (size_t)(-1). *inbuf не меняется и указывает на начало входящей неполной байтовой последовательности.
4. В буфере вывода нет места для очередного символа, кодировка которого должна быть изменена. В этом случае errno устанавливается равной E2BIG и возвращает (size_t)(-1).
Есть еще особый случай, когда inbuf равно NULL (или *inbuf равно NULL), при этом outbuf не равно NULL и *outbuf не равно NULL. В этом случае функция iconv пытается установить статус приведения cd в исходное состояние и сохранить измененную последовательность в *outbuf. Максимальное количество записанных байтов будет равно *outbytesleft (начиная с *outbuf). Если в буфере для вывода данных нет места для данной последовательности, то переменная errno устанавливается равной E2BIG и возвращается (size_t)(-1). Иначе увеличивается *outbuf и уменьшается *outbytesleft на количество записанных байтов.
В третьем случае, когда inbuf равно NULL (или *inbuf равно NULL) и outbuf равно NULL (или *outbuf равно NULL), функция iconv устанавливает статус преобразования cd равным начальному состоянию.
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |