Шаг 546.
Библиотека STL. Интернационализация. Классификация и преобразования символов. Классификация символов

    На этом шаге мы рассмотрим фацеты, используемые для классификации символов.

    В стандартной библиотеке C++ определены два фацета для работы с символами: ctype и codecvt. Оба фацета относятся к категории locale::ctype. Фацет ctype используется в основном при классификации символов (например, проверки того, является ли символ буквой). Кроме того, в нем предусмотрены методы смены регистра символов, а также преобразования между char и типом символов, для которого был специализирован данный фацет. Фацет codecvt обеспечивает смену кодировок символов и используется в основном шаблоном basic_filebuf для преобразования между внутренними и внешними представлениями.

Классификация символов

    Фацет ctype представляет собой шаблон, параметризованный по типу символов. Класс ctype<charT> поддерживает три категории функций:

    Функции фацета ctype перечислены в таблице 1.

Таблица 1. Функции фацета ctype
Выражение Описание
ct.is(m, с) Проверяет, соответствует ли символ с маске m
ct.is(beg, end, vec) Для каждого символа в интервале между beg и end сохраняет маску символа в соответствующей позиции vec
ct.scan_is(m, beg, end) Возвращает указатель на первый символ в интервале между beg и end, соответствующий маске m, или end при отсутствии таких символов
ct.scan_not(m, beg, end) Возвращает указатель на первый символ в интервале между beg и end, не соответствующий маске m, или end, если все символы соответствуют заданной маске
ct.toupper(c) Возвращает букву верхнего регистра, соответствующую символу с. Если такой буквы не существует, возвращает с
ct.toupper(beg, end) Преобразует все буквы в интервале между beg и end; каждая буква заменяется результатом вызова toupper()
ct.tolower(c) Возвращает букву нижнего регистра, соответствующую символу с. Если такой буквы не существует, возвращает с
ct.tolower(beg, end) Преобразует все буквы в интервале между beg и end; каждая буква заменяется результатом вызова tolower()
ct.widen(c) Возвращает символ char с, преобразованный к типу charT
ct.widen(beg, end, dest) Для каждого символа в интервале между beg и end помещает результат вызова widen() в соответствующую позицию dest
ct.narrow(c, default) Возвращает символ charT с, преобразованный к типу char, или символ default, если такого символа не существует
ct.narrow(beg, end, default, dest) Для каждого символа в интервале между beg и end помещает результат вызова narrow() в соответствующую позицию dest

    Функция is(beg,end,vec) сохраняет в массиве маски символов. Для каждого символа в интервале между beg и end в массиве, на который ссылается аргумент vec, сохраняется маска с установкой соответствующих атрибутов символов. Использование этой функции позволяет избежать многократных вызовов виртуальных функций при большом количестве классифицируемых символов.

    Функция widen() преобразует символ типа char из исходной кодировки в кодировку, используемую локальным контекстом. Это означает, что вызов widen() может быть оправдан даже в том случае, если результат тоже относится к типу char. Обратное преобразование осуществляется функцией narrow(), которая преобразует символ из кодировки, используемой локальным контекстом, в соответствующий символ char (при условии, что такой символ существует). В следующем фрагменте строка с десятичными цифрами преобразуется из типа char в wchar_t:

  std::locale loc;
  char narrow[] = "0123456789":
  wchar_t wide[10];

  std::use_facet<std::ctype<wchar_t> >(loc).widen(narrow, narrow+10,wide);

    Класс ctype является производным от класса ctype_base. Этот класс используется только для определения перечисляемого типа mask. В перечисляемом типе задаются значения, сочетание которых образует битовую маску для проверки свойств символов. Значения, определенные в классе ctype_base, перечислены в таблице 2. Функциям классификации символов передается битовая маска, которая представляет собой комбинацию этих значений с поразрядными операторами |, &, ^ и ~. Символ совпадает с маской только в том случае, если он принадлежит хотя бы к одной категории, определяемой этой маской.

Таблица 2. Маски символов, используемые фацетом ctype
Выражение Описание
ctype_base::alnum Буквы и цифры (эквивалент alpha|digit)
ctype_base::alpha Буквы
ctype_base::cntrl Управляющие символы
ctype_base::diglt Десятичные цифры
ctype_base::graph Знаки препинания, буквы и цифры (эквивалент alnum|punct)
ctype_base::lower Буквы нижнего регистра
ctype_base::print Печатные символы
ctype_base::punct Знаки препинания
ctype_base::space Пропуски
ctype_base::upper Буквы верхнего регистра
ctype_base::xdlgit Шестнадцатеричные цифры

    На следующем шаге мы рассмотрим специализации ctype для типа char.




Предыдущий шаг Содержание Следующий шаг