|
Программирование >> Операторы преобразования типа
О В расширенных кодировках символ всегда представляется постоянным количеством байтов независимо от его типа. В типичных кодировках символ представляется величиной 2 или 4 байта. На концептуальном уровне такие кодировки не отличаются от представлений, в которых для локальных контекстов, где достаточно кодировки ISO Latin-1 или даже ASCII, используется однобайтовая кодировка. Многобайтовое представление более компактно по сравнению с расширенным, поэтому для хранения данных вне программ обычно применяется многобайтовое представление. И наоборот, с символами фиксированного размера гораздо удобнее работать, поэтому в программах обычно используется расширенное представление. В ISO C+-f, как и в ISO С, используется тип wchar t для расширенных кодировок. С другой стороны, в С++ wchar t является ключевым словом, а не определением типа, что позволяет перегружать все функции с этим типом. В многобайтовой строке один и тот же байт может представлять целый символ или его часть. В процессе перебора содержимого многобайтовой строки каждый байт интерпретируется согласно текущему состоянию сдвига . В зависимости от значения байта и текущего состояния сдвига байт может представлять символ или изменение состояния сдвига. Многобайтовая строка всегда начинается с определенного исходного состояния сдвига. Например, в исходном состоянии байты могут представлять символы ISO Latin-1 до тех пор, пока не будет обнаружен специальный символ перехода. Символ, следующий за ним, определяет новое состояние сдвига. Допустим, в новом состоянии сдвига байты могут интерпретироваться как арабские символы до тех пор, пока не будет обнаружен следующий символ перехода. Преобразование между кодировками символов осуществляется при помощи шаблона codecvto (см. с. 689). Этот класс используется в основном классом basic filebuf<> (см. с. 602) для преобразования между внутренними и внешними представлениями. В стандарте С++ многобайтовые кодировки символов не оговариваются, но в нем предусмотрена запись состояния сдвига. У функций класса codecvto имеется аргумент, в котором может храниться произвольное состояние строки. Кроме того, класс поддерживает функцию для определения последовательности символов, используемой для возврата к исходному состоянию сдвига. Трактовки символов Различия в кодировках существенны для обработки строк и ввода-вывода. Например, признак конца файла - и конкретные особенности сравнения символов могут различаться в зависимости от реализации. Предполагается, что строковые и потоковые классы будут специализироваться встроенными типами, прежде всего char и wchar t. Интерфейс встроенных типов должен оставаться неизменным, поэтому информация о разных аспектах представления символов выделяется в )тдельный класс - так называемый тсласс трактовок символов. Он передается строковым и потоковым классам в аргументе шаблона. По умолчанию в этом аргументе передается класс char traits, параметризованный по аргументу, определяющему тип символов строки или потока данршсс: namespace std { tempiate<class charT. class traits - char traits<charT>, class Allocator = allocator<charT> > class baslc string; namespace std { template<class charT. class traits class basic istream: template<class charT. class traits class basic ostream; = char traits<charT> > = char traits<charT> > Трактовки символов указываются в классе char traits<>, который определяется в заголовочном файле <string> и параметризуется по конкретному типу символов: namespace std { template <class charT> struct char traits { Классы трактовок определяют все основные свойства типа символов и операции, необходимые для реализации строк и потоков данных как статических компонентов. Члены класса char traits перечислены в табл. 14.1. Таблица 14.1. Члены класса трактовок символов Выражение Описание char type Тип символов (то есть аргумент шаблона char traits) intjype Тип, размеры которого достаточны для представления дополнительного, не используемого для других целей признака конца файла pos type Тип, используемый для представления позиций в потоке off type Тип, используемый для представления смещений между позициями в потоке state type Тип, испопьзуемый для представления текущего состояния в многобайтовых потоках assign(cl, с2) Присваивает d символ с2 eq(cl, с2) Проверяет равенство символов с1 и с2 Выражение Описание lt(cl, с2) length(5) compare(sl, s2, n) copy(sl, s2, n) move(sl, s2, n) asslgn(s, n, c) find(s, n, c) eof() to Int type(c) to char type(i) not eof(i) eci lnt type(il, i2) Проверяет условие символ cl меньше символа с2 Возвращает длину строки s Сравнивает до п символов строк si и s2 Копирует п символов строки s2 в si Копирует п символов строки s2 в si, причем строки si и s2 могут перекрываться Присваивает символ с п символам строки s Возвращает указатель на первый символ строки s, равный с; если среди первых п символов такой символ отсутствует, возвращает О Возвращает признак конца файла Преобразует символ с в соответствующее представление типа InLtype Преобразует представление i типа int type в символ (результат преобразования EOF не определен) Возвращает значение i, если i не является представлением EOF; в этом случае возвращается значение, определяемое реализацией (и отличное от EOF) Проверяет равенство двух символов 11 и 12, представленных в виде типа int; type (иначе говоря, аргументы могут быть равны EOF) Функции обработки строк или последовательностей символов присутствуют только по соображениям оптимизации. Они могут быть реализованы при помощи функций, обрабатывающих отдельные символы. Например, функция сору() реализуется на базе assign(), однако при работе со строками возможны более эффективные реализации. Все значения количества символов в табл. 14.1 задаются точно, то есть без учета символов завершения строк. Последняя группа функций предназначена для работы с признаком конца файла (EOF). Этот служебный символ расширяет кодировку и требует специальной обработки. Для некоторых представлений типа символов может оказаться недостаточно, поскольку значение символа EOF должно отличаться от значений всех обычных символов кодировки. По правилам языка С функции чтения символов возвращали тип int вместо char. В С++ эта методика была усовершенствована. В трактовках символов char typ€ определяется как тип для представления всех символов, а int type - как тип для представления всех символов и EOF. Функции to char type(), to int type(), not eof() и eq int type() определяют соответствующие преобразования и сравнения. Для некоторых классов трактовок типы char type и int type могут быть идентичными. Например, если не все значения типа char type необходимы для представления символов, одно из свободных значений может использоваться для представления символа конца файла. Типы posjype и off type используются для определения позиций и смещений (подробности см. на с. 609).
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |