В версии glibc под номером 2.2.2 введено несколько новых, нестандартных категорий локали. В LC_ADDRESS определяются правила зависящих от локали представлений почтовых адресов. В LC_IDENTIFICATION указывается информация, идентифицирующая локаль. В LC_MEASUREMENT определяется местная система мер (например, метрическая или дюймовая). В LC_NAME устанавливаются местные правила представления личных имен и титулов. В LC_PAPER определяется стандартный для данной местности размер бумаги (например, принятый в США формат Letter или формат A4, используемый в большинстве других стран). В LC_TELEPHONE задаются правила для местного представления внутренних и международных телефонных номеров, а также международного префикса страны и префикса выхода на международную телефонную сеть.
Таблица 10.2. Содержимое подкаталогов локали
Имя файла — Назначение
LC_CTYPE — Файл содержит классификацию символов (см. isalpha(3)) и правила, применяемые при преобразовании регистра
LC_COLLATE — Файл включает правила сортировки набора символов
LC_MONETARY — Файл содержит правила форматирования денежных величин (см. localeconv(3) и
LC_NUMERIC — Файл содержит правила форматирования для чисел, не являющихся денежными величинами (см. localeconv(3) и
LC_TIME — Файл включает правила форматирования для даты и времени
LC_MESSAGES — Каталог содержит файлы, указывающие форматы и значения, используемые для утвердительных и отрицательных ответов (да — нет)
Фактические настройки локали, определенные в системе, могут изменяться. В SUSv3 насчет этого не выдвигается никаких требований, за исключением необходимости определения стандартной настройки локали по имени POSIX (и по историческим причинам ее синонима по имени C). Эта локаль воспроизводит исторически сложившееся поведение систем UNIX. Так, она основана на наборе кодировки символов ASCII и использует английский язык для названия дней и месяцев, а также односложных ответов yes и no. Денежные и числовые компоненты в этой локалии не определяются.
Команда locale выводит информацию о текущей локали среды (в оболочке). Команда locale — a выводит списком полный набор локалей, определенных в системе.
Для установки и запроса локали программы используется функция setlocale(), синтаксис которой представлен далее.
#include
char *setlocale(int
Возвращает указатель на (обычно статически выделенную) строку, определяющую новые или текущие местные настройки, при успехе или NULL при ошибке
Аргумент category выбирает, какую часть данных о локали установить или запросить, и указывается набор констант, чьи имена совпадают с категориями локали, перечисленными в табл. 10.2. Это, к примеру, означает, что можно настроить локаль так, чтобы отображалось время как в Германии, а вместе с тем задать отображение денежных сумм в долларах США. Или же, что бывает значительно чаще, мы можем использовать значение LC_ALL, чтобы указать, что нам нужно установить все аспекты локали.
Есть два различных метода настройки локали с помощью функции setlocale(). Аргумент locale должен быть строкой, указывающей на одну из локалей, определяемых в системе (то есть на имя одного из подкаталогов в каталоге /usr/lib/locale), например de_DE или en_US. Или же locale может быть указан в виде пустой строки, что означает необходимость получения настроек локали из переменных среды:
setlocale(LC_ALL, "");
Такой вызов нужно использовать, чтобы программа считала информацию из соответствующих переменных среды, имеющих отношение к локализации. Без такого вызова эти переменные среды никак не повлияют на программу.
При запуске программы, выполняющей вызов setlocale(LC_ALL,""), мы можем управлять различными аспектами локали, используя набор переменных среды, чьи имена также соответствуют категориям, перечисленным в табл. 10.2: LC_CTYPE, LC_COLLATE, LC_MONETARY, LC_NUMERIC, LC_TIME и LC_MESSAGES. Для указания настроек всей локали также можно воспользоваться переменной среды LC_ALL или LANG. При установке более одной из ранее перечисленных переменных среды у LC_ALL имеется приоритет над всеми другими переменными вида LC_*, а LANG имеет самый низкий уровень приоритета. Следовательно, LANG можно применять для настроек локали, используемых по умолчанию для всех категорий, а затем воспользоваться отдельными переменными LC_* для настройки составляющих локали на что-либо другое, чем эти установки по умолчанию.
В результате функция setlocale() возвращает указатель на (обычно статически размещаемую) строку, которая идентифицирует настройки локали для конкретной категории. Если мы интересуемся только получением текущих настроек локали без внесения в них изменений, для аргумента locale следует установить значение NULL.