На этом шаге мы рассмотрим фацеты, используемые для классификации символов.
В стандартной библиотеке C++ определены два фацета для работы с символами: ctype и codecvt. Оба фацета относятся к категории locale::ctype. Фацет ctype используется в основном при классификации символов (например, проверки того, является ли символ буквой). Кроме того, в нем предусмотрены методы смены регистра символов, а также преобразования между char и типом символов, для которого был специализирован данный фацет. Фацет codecvt обеспечивает смену кодировок символов и используется в основном шаблоном basic_filebuf для преобразования между внутренними и внешними представлениями.
Фацет ctype представляет собой шаблон, параметризованный по типу символов. Класс ctype<charT> поддерживает три категории функций:
Функции фацета ctype перечислены в таблице 1.
Выражение | Описание |
---|---|
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. Функциям классификации символов передается битовая маска, которая представляет собой комбинацию этих значений с поразрядными операторами |, &, ^ и ~. Символ совпадает с маской только в том случае, если он принадлежит хотя бы к одной категории, определяемой этой маской.
Выражение | Описание |
---|---|
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.