Книга: Linux программирование в примерах
13.2.2. Установка локали: setlocale()
13.2.2. Установка локали: setlocale()
Как уже упоминалось, если вы ничего не делаете, программы на С и библиотека С ведет себя так, как если бы использовалась локаль «С». Функция setlocale()
устанавливает соответствующую локаль:
#include <locale.h> /* ISO С */
char *setlocale(int category, const char *locale);
Аргумент category
является одной из категорий, описанных в разделе 13.2.1 «Категории локалей и переменные окружения». Аргумент locale
является строкой, именующей используемую для этой категории локаль. Когда locale
является пустой строкой (""
), setlocale()
проверяет соответствующие переменные окружения.
Если locale
равно NULL
, сведения о локали не изменяются. Вместо этого функция возвращает строку, представляющую текущую локаль для данной категории.
Поскольку каждая категория может быть установлена индивидуально, автор приложения решает, насколько будет программа использовать локаль. Например, если main()
делает лишь это —
setlocale(LC_TIME, "");
/* Использование локали только для времени и все */
— тогда, независимо от установленных в окружении других переменных LC_xxx
, локали подчиняются лишь функции времени и даты. Все остальные действуют так, как если бы программа по-прежнему работала в локали «С». Сходным образом вызов:
setlocale(LC_TIME, "it_IT"); /* Время всегда итальянское */
заменяет переменную окружения LC_TIME
(также, как LC_ALL
), заставляя программу использовать для вычислений времени/даты данные для Италии. (Хотя Италия может быть прекрасным местом, программам лучше использовать ""
, чтобы они могли корректно работать везде; этот пример предназначен лишь для объяснения того, как работает setlocale()
.)
Можно индивидуально вызывать setlocale()
для каждой категории, но простейшим способом является установка всего одним махом:
/* Находясь в Риме, вместо «всего» делайте все как римляне. :-) */
setlocale(LC_ALL, "");
Возвращаемое setlocale()
значение является текущей установкой локали. Это либо строковое значение, переданное в предыдущем вызове, либо непрозрачное значение, представляющее используемую вначале локаль. Это самое значение может быть затем передано обратно setlocale()
. Для последующего использования возвращаемое значение должно быть скопировано в локальное хранилище, поскольку это указатель на внутренние данные.
char *initial_locale;
initial_locale = strdup(setlocale(LC_ALL, "")); /* сохранить копию */
...
(void)setlocale(LC_ALL, initial_locale); /* восстановить ее */
Здесь мы сохранили копию, использовав функцию POSIX strdup()
(см. раздел 3.2.2 «Копирование строк: strdup()
»).
- 13.2.1. Категории локалей и переменные окружения
- 13.2.2. Установка локали: setlocale()
- 13.2.3. Сравнение строк: strcoll() и strxfrm()
- 13.2.4. Числовое и денежное низкоуровневое форматирование: localeconv()
- 13.2.5. Высокоуровневое числовое и денежное форматирование: strfmon() и printf()
- 13.2.6. Пример: форматирование числовых значений в gawk
- 13.2.7. Форматирование значений даты и времени: ctime() и strftime()
- 13.2.8. Другие данные локали: nl_langinfo()
- 13.2. Локали и библиотека С
- Установка локали (локальных настроек)
- Расширенная установка InterBase-сервера
- Установка системы на уже подготовленный жесткий диск
- Установка файлов занятий
- 2 Установка системы
- Глава 4. Установка и конфигурирование сетевых интерфесов
- Часть III Установка, настройка и оптимизация операционной системы
- Демонтаж и установка МП
- Установка
- Установка пароля
- Установка ЦП