Программирование >>  Операторы преобразования типа 

1 ... 223 224 225 [ 226 ] 227 228 229 ... 239


Стандарт С++ не определяет конкретную семантику второго преобразования. Единственное естественное решение заключается в разбиении каждого объекта wchar t на sizeof(wchar t) объектов типа char для преобразования wchar t в char и сборке wchar t из того же количества объектов char при обратном преобразовании. Обратите внимание на принципиальные отличия этого преобразования от тех, которые выполняются функциями widen() и narrow() фацета ctype: если функции codecvt используют биты нескольких объектов char для формирования одного объекта wchar t (или наоборот), функции ctype преобразуют символ из одной кодировки в соответствующий символ другой кодировки (если он существует).

Фацет codecvt, как и ctype, является производным от базового класса с определением перечисляемого типа. Базовый класс называется codecvt base, в нем определяется перечисляемый тип result. Значения перечисляемого типа требуются при описании результатов вызова функций codecvt. Точный смысл каждого значения зависит от вызываемой функции. В табл. 14.20 перечислены функции фацета codecvt.

Таблица 14.20. Функции фацета codecvt Выражение Описание

cvt.in(s, fb, fe, fn, tb, te, tn) Преобразует внешнее представление к внутреннему

cvt.out(s, fb, fe, fn, tb, te, tn) Преобразует внутреннее представление к внешнему

cvt.unshift(s, tb, te, tn) Записывает служебную последовательность для переключения

к исходному состоянию сдвига

cvt.encodingO Возвращает информацию о внешней кодировке

cvt.aways noconv() Возвращает true, если преобразование не выполняется

cvt.length(s, fb, fe, max) Возвращает количество объектов extemT в интервале между fb

и fe для получения max символов во внутреннем представлении

cvt.maxJengthO Возвращает максимальное количество объектов externT,

необходимых для создания одного объекта internT

Функция 1п() преобразует внешнее представление к внутреннему. Аргумент s содержит ссылку на stateT, Перед преобразованием этот аргумент определяет состояние сдвига, используемое в начале преобразования, а после преобразования в нем сохраняется итоговое состояние сдвига. Переданное состояние сдвига может отличаться от исходного, если текущий буфер не является первым из обрабатываемых буферов. Аргументы fb и fe относятся к типу const InternT* и определяют соответственно начало и конец входного буфера. Аргументы tb и te относятся к типу externT* и определяют соответственно начало и конец выходного буфера. Аргументы fn (тип const extern&*&) и tn (тип internT*&) содержат ссылки, в которых возвращается конец преобразуемой последовательности символов во входном и выходном буферах соответственно. Конец любого буфера может быть достигнут до того, как будет достигнут Конец другого буфера. Функция возвращает значение типа codecvt base::result (табл. 14.21).



Таблица 14.21. Возвращаемые значения функций преобразования

Выражение Описание

ок Все исходные символы были успешно преобразованы

partial Не все символы были успешно преобразованы, или для получения

преобразованного символа нужны дополнительные символы

error Обнаружен исходный символ, который невозможно преобразовать

noconv Преобразование не требуется

Возвращаемое значение ок означает, что функция успешно справилась со своей работой. Если /п==/е, это означает, что входной буфер был обработан полностью, а последовательность в интервале между tb vitn содержит результат преобразования. Символы этой последовательности соответствуют символам входной последовательности (возможно - с добавлением законченного символа от предыдущего преобразования). Если аргумент s функции in() не находился в исходном состоянии, возможно, в нем хранился незавершенный символ от предыдущего преобразования.

Если функция возвращает значение partial, это может означать одно из двух: либо выходной буфер был заполнен до завершения чтения входного буфера, либо входной буфер был прочитан полностью при наличии незавершенных символов (например, если последний байт входной последовательности был частью служебной последовательности для переключения состояний сдвига). Если /е==/п, входной буфер был прочитан полностью, В этом случае последовательность между tb и tn содержит все полностью преобразованные символы. Информация, необходимая для завершения преобразования символа, сохраняется в состоянии сдвига s. Если/е1=/п, входной буфер был прочитан не полностью. В этом случае следующее преобразование будет продолжено с позиции fn.

Возврапдаемое значение noconv является признаком особой ситуации: оно означает, что преобразования внешнего представления во внутреннее не потребовалось. В этом случае fn присваивается /6, а tn присваивается tb. В приемной последовательности не сохраняется ничего, поскольку вся необходимая информация уже хранится во входной последовательности.

Если функция возвращает код error, это означает, что исходный символ преобразовать не удалось. Это может произойти по нескольким причинам: например, в приемной кодировке отсутазует представление для соответствующего символа или обработка входной последовательности завершилась в недопустимом состоянии сдвига. Стандарт С++ не определяет механизм, который позволил бы точнее определить причину ошибки.

Функция out() эквивалентна 1п(), но она работает в обратном направлении, то есть преобразует внутреннее представление во внешнее. Аргументы и возвращаемые значения двух функций совпадают, различаются только типы аргументов: tb и te относятся к типу const internT*, а fb w fe - т типу const externT*. To же можно сказать и об аргументах/п и tn.



Функция unshift() вставляет символы, необходимые для завершения последовательности, когда в аргументе s передается текущее состояние преобразования. Обычно это означает, что состояние сдвига возвращается к исходному. Завершается только внешнее представление. Аргументы tb и tf относятся к типу externT*, а аргумент г/г - к типу extemT&*. Интервал между tb н te определяет выходной буфер, в котором сохраняются символы. Конец выходной последовательности хранится в tn. Значения, возвращаемые функций unshift(), перечислены в табл. 14.22.

Таблица 14.22. Возвращаемые значения функций преобразования Выражение Описание

ок Последовательность завершена успешно

partial Для завершения последовательности нужны дополнительные символы

еп-ог Недействительное состояние

noconv Для завершения последовательности символы не требуются

Функция encodingO возвращает дополнительную информацию о кодировке внешнего представления. Если encoding() возвращает -1, преобразование зависит от состояния. Если encodingO возвращает О, то количество объектов externT, необходимых для построения символа во внутренней кодировке, является переменной величиной. В противном случае функция возвращает количество объектов externT, необходимых для построения internT. Эта информация может использоваться для выделения буфера соответствующего размера.

Функция always noconv() возвращает true, если функции in() и out() никогда не выполняют преобразования. Например, стандартная реализация codecvt<char, char,mbstate t> преобразований не выполняет, поэтому для этого фацета функция always noconv() всегда возвращает true. Тем не менее это относится только к фацету codecvt локального контекста С , другие экземпляры этого фацета могзп выполнять преобразования.

Функция lengthO возвращает количество объектов externT в интервале между fb и fe, необходимых для построения тсис символов типа internT. Если интервал между fb и fe содержит менее тсис полных символов типа internT, возвращается количество объектов externT, необходимых для построения максимально возможного количества символов типа InternT,

Контекстная сортировка

Фацет collate скрывает различия между правилами сортировки строк в разных локальных контекстах. Например, в немецком языке буква й при сортировке строк эквивалентна букве и или сочетанию не . В других языках эта буква даже не считается буквой и интерпретируется как специальный символ (или пе интерпретируется вовсе), но в этих языках действуют иные правила сортировки для некоторых сочетаний символов. Чтббы строки автоматически сортировались



1 ... 223 224 225 [ 226 ] 227 228 229 ... 239

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика