×
Traktatov.net » Язык программирования C [Лекции и упражнения, 6-е изд.] » Читать онлайн
Страница 539 из 557 Настройки


Утилиты для работы с многобайтными и широкими символами: wchar.h (С99)

Каждая реализация имеет свой базовый набор символов, и тип char в языке С должен быть достаточно широким, чтобы поддерживать этот набор. Реализация может также поддерживать расширенные наборы символов, а эти символы могут требовать для своего представления более одного байта на символ. Многобайтные символы могут сохраняться наряду с однобайтными в обычном массиве char, где определенные значения байта служат признаками присутствия многобайтного символа и его размера. Интерпретация многобайтных символов может зависеть от состояния сдвига. В начальном состоянии сдвига однобайтные символы интерпретируются обычным образом. Специфические многобайтные символы затем могут изменять состояние сдвига. Определенное состояние сдвига остается в силе до тех пор, пока не будет явно изменено.


888 Приложение Б

Тип wchar t обеспечивает второй способ представления широких символов, когда ширина типа выбирается достаточной для представления кодировки любого элемента из расширенного набора символов. Такое представление широких символов позволяет помещать отдельные символы в переменные тина wchar t, а строки таких символов представлять в виде массивов wchar_t. Представление широких символов не обязательно должно совпадать с многобайтным представлением, потому что второе может применять состояния сдвига, в то время как первое — нет.

Заголовочный файл wchar_t предоставляет средства для обработки обоих представлений широких символов. В нем определены типы, перечисленные в табл. B.V,46 (некоторые из этих типов также определены в других заголовочных файлах).

Таблица 6.V.46. Типы, определенные в wchar.h


Библиотека содержит функции ввода-вывода, являющиеся аналогами стандартных функций ввода-вывода, которые определены в stdio.h. В тех случаях, когда стандартная функция ввода-вывода возвращает EOF, соответствующая функция для широких символов возвращает WEOF. Эти функции перечислены в табл. B.V.48.


Справочные материалы 889

Таблица 6.V.48. Функции ввода-вывода для работы с широкими символами


Существует одна функция ввода-вывода с широкими символами, не имеющая аналога в стандартной библиотеке ввода-вывода:

int fwide(FILE *stream, int mode);

Если аргумент mode имеет положительное значение, то сначала эта функция пытается трактовать поток, представленный параметром stream, как ориентированный на широкие символы, а если отрицательное — то как ориентированный на байты. Если же значение mode равно нулю, функция не пытается изменить ориентацию потока. Попытка изменения ориентации предпринимается, только если она не была назначена потоку изначально. Во всех случаях функция возвращает положительное значение, если поток ориентирован на широкие символы, отрицательное значение, если поток ориентирован на байты, и ноль, если ориентация потока не установлена.

Заголовочный файл wchar.h предлагает несколько функций для манипуляции и преобразования строк, которые моделируют такие же функции из string.h. В общем случае фрагмент str в идентификаторах из string.h заменяется фрагментом wcs, так что wcstod() — это версия функции strtod() для широких символов. Такие функции пепечислены r тябл. K.V.49.