|
Программирование >> Операторы преобразования типа
содержать не менее 256 символов. Второй необязательный аргумент конструктора ctype<char> указывает, должна ли таблица удаляться при уничтожении фацета. Если аргумент равен true, то переданная конструктору таблица освобождается при вызове delete[], когда фацет становится ненужным. Защищенная функция table() возвращает таблицу, переданную в первом аргументе конструктора. Статическая защищенная функция classic table() возвращает таблицу, используемую для классификации символов в классическом локальном контексте С. Глобальные вспомогательные функции классификации символов Для удобства работы с фацетом ctype определен ряд глобальных функций, перечисленных в табл. 14.9. Таблица 14.19. Глобальные вспомогательные функции классификации символов Функция Описание isalnum(c, loc) Проверяет, является ли с буквой или цифрой (эквивалент isalpha()8t&isdlglt()) isalpha(c, loc) Проверяет, является ли с буквой lscntrl(c, loc) Проверяет, является ли с управляющим символом lsdigit(c, loc) Проверяет, является ли с цифрой isgraph(c, loc) Проверяет, является ли с печатным символом, исключая пробелы (эквивалент lsalnum()&&ispunct()) lslower(c, loc) Проверяет, является ли с буквой нижнего регистра isprint(c, loc) Проверяет, является ли с печатным символом (включая пропуски) ispunct(c, loc) Проверяет, является ли с знаком препинания (то есть печатным символом, отличным от Пробела, цифры или буквы) isspace(c, loc) Проверяет, является ли с пробелом lsupper(c, loc) Проверяет, является ли с буквой верхнего регистра isxdigit(c, loc) Проверяет, является ли с шестнадцатеричной цифрой tolower(c, loc) Преобразует с из верхнего регистра в нижний toupper(c, loc) Преобразует с из нижнего регистра в верхний Например, следующее выражение проверяет, является ли символ с буквой нижнего регистра в локальном контексте loc: std::lslower(c,loc) Функция возвращает значение типа bool. Следующее выражение возвращает символ с, преобразованный в букву верхнего регистра в локальном контексте 1эс: std::toupper(c.loc) Если с не является буквой нижнего регистра, функция возвращает первый аргумент без изменений. Представленный ниже вызов и следующая за ним конструкция эквивалентны: std::1slower(c.loc) std:;use facet<std::ctype<char> >(loc).is(std::ctype base::lower.c) В приведенном выражении вызывается функция is() фацета ctype<char>. Функция is() проверяет, относится ли символ с к какой-либо из категорий, определяемых маской (первый аргумент). Значения флагов маски определяются в классе ctype base. Примеры использования вспомогательных функций приведены на с. 484 и 643. Глобальные вспомогательные функции классификации символов соответствуют одноименным функциям С, получающим только один аргумент. Эти функции определяются в заголовочных файлах <cctype> и <ctype.h> и всегда используют текущий единый локальный контекст Работать с ними еще удобнее: if Cstd::1sdlgitCc)) { ) Тем не менее при использовании этих функций вы не сможете работать с разными локальными контекстами в одной программе, а также задействовать функции С с пользовательским фацетом ctype. Пример применения функций С для преобразования всех символов строки к верхнему регистру приведен на с. 481 Вспомогательные функции С++ не должны использоваться в тех фрагментах кода, которые критичны по быстродействию. Гораздо быстрее получить соответствующий фацет от локального контекста и работать с функциями этого объекта напрямую. Если требуется классифицировать большое количество символов в одном локальном контексте, имеется еще более эффективное решение (во всяком случае, для символов, не относящихся к типу char). Для классификации типичных символов можно воспользоваться функцией \s{beg, end, vec): эта функция строит для каждого символа из интервала [beg,end) маску с описанием свойств этого символа. Полученная маска сохраняется в элементе вектора vec, позиция которого соответствует позиции символа. Далее полученный вектор используется для быстрой идентификации символов. Преобразование кодировок Фацет codecvt выполняет преобразования между внутренней и внешней кодировками символов. Например, с его помощью можно преобразовывать символы из Unicode в EUC (Extended UNIX Code) при условии, что реализация стандартной библиотеки С++ поддерживает соответствующий фацет. Этот локальный контекст идентичен глобально назначенному локальному контексту С++ только в том случае, если последний вызов locale::global() производился с именованным контекстом и функция setlocale() с тех пор це вызывалась. В противном случае локальный контекст, используемый функциями С, будет отлщшться от глобально назначенного локального контекста С++. Этот фацет используется классом basic filebuf для преобразования между внутренней кодировкой и представлением, хранящимся в файле. Класс basic filebuf<charT,traits> (см. с. 602) задействует для этой цели специализацию codecvt <charT,char,typename traits: :state type>. Применяемый фацет берется из локального контекста, связанного с basic filebuf. Данный способ применения фацета является основным, напрямую с этим фацетом работают крайне редко. На с. 658 были приведены начальные сведения о кодировке символов. Чтобы понять, как работает фацет codecvt, необходимо знать о существовании двух схем кодировки: в одной схеме каждый символ кодируется фиксированным количеством байтов (расширенная кодировка), а в другой используется переменное количество байтов на символ (многобайтовая кодировка). Также необходимо знать о том, что в многобайтовых кодировках для повышения эффективности представления используется так называемое состояние сдвига. Чтобы правильно интерпретировать байт, необходимо знать состояние сдвига для данной позиции. Состояние сдвига определяется только полным перебором всей последовательности многобайтовых символов (за подробностями обращайтесь к с. 658). Шаблон фацета codecvto получает три аргумента: О тип символов внутреннего представления internT; О тип символов внешнего представления charT; О тип stateT, используемый для представления промежуточного состояния в процессе преобразования. Промежуточное состояние может состоять из незавершенных символов в расширенной кодировке или текущего состояния сдвига. Стандарт С++ не делает никаких ограничений по поводу того, что должно храниться в объектах, представляющих состояние. Во внутреннем представлении символы всегда кодируются фиксированным количеством байтов. Как правило, программы работают с символьными данными типов char и wchar t, а во внешнем представлении может использоваться многобайтовая или расширенная кодировка, В случае многобайтовой кодировки второй аргумент шаблона определяет тип представления ее базовых единиц. Каждый многобайтовый символ состоит из одного или нескольких объектов этого типа. Обычно для этой цели применяется тип char. В третьем аргументе передается тип, используемый для представления текущего состояния преобразования. Например, если одна из кодировок является многобайтовой, обработка многобайтового символа может быть прервана из-за переполнения исходного или приемного буфера. В этом случае текущее состояние преобразования сохраняется в объекте заданного типа. По аналогии с другими фацетами стандарт требует обязательной поддержки минимального количества специализаций. Стандартная библиотека С++ поддерживает только две специализации: О codecvt<char,char,rnbstate t> - преобразование исходной кодировки самой в себя (вырожденная версия фацета codecvt); О codecvt<wchar t,char,mbstate t> - преобразование между исходной узкой кодировкой (то есть char) и расширенной кодировкой (wchar t).
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |