Установка или изменение locale для программиста
Дальше: Форматирование чисел и дежежных Вверх: Интернационализация Назад: Пример смешанного locale
Установка или изменение locale для программиста
Программам на языке C переменные окружения доступны либо через третий аргумент функции main, либо (что на самом деле то же самое) с помощью функций getenv и putenv. Однако даже если переменная окружения LANG либо какие-то переменные из перечисленных выше установлены, автоматической установки locale не происходит. Стандарт ISO на язык C требует, чтобы выполнение программы начиналось (и продолжалось -- при отсутствии каких-либо специальных действий) в locale по умолчанию -- C(POSIX) - locale. Специальным же действием для установки нужного locale является вызов функции setlocale. Например, такой вызов
setlocale (LC_ALL, "");
устанавливает locale, основываясь на значениях переменных окружения. Функцию setlocale можно использовать и для установки locale отдельно для каждой категории. Для использования функции setlocale нужно подключать заголовочный файл locale.h. Прототип функции setlocale описан в этом файле следующим образом:
extern char *setlocale (int category, const char *locale);
Корректное использование функции setlocale предполагает выполнение следующих соглашений:
- при любых ошибках возвращается NULL и текущее locale остается неизменным;
- если аргумент category равен LC_ALL, то указанное locale устанавливается для всех категорий; иначе значение параметра category должно быть одним из LC_CTYPE, LC_NUMERIC, LC_TIME, LC_COLLATE, LC_MONETARY, LC_MESSAGES;
- если параметр locale равен ``'' (пустой строке), то устанавливается locale,
специфицированное соответствующей переменной окружения; например, вызов
setlocale (LC_NUMERIC, ``'')
приведет к установлению категории locale, отвечающей за представление числовых величин, соответственно значению переменной окружения LC_NUMERIC. Такой вызов завершится ошибкой, если такая переменная содержит некорректное значение (имя несуществующего locale); если же соответствующая переменная не установлена, то будет возвращено имя текущего locale; - если параметр locale равен NULL, возвращается имя текущего locale в соответствии со значением параметра category. Возвращаемая строка может быть перезаписана последующими вызовами setlocale, поэтому в слючае дальнейшего использования она должна быть скопирована. Явное изменение этой строки нежелательно, так как она может быть той же самой строкой, которая была использована в предыдушем вызове setlocale.
Ниже приведен пример программы, иллюстрирующей поведение функции setlocale:
/* * setlocale.c * Пример программы, устанавливающей locale. */ #include <stdio.h> #include <locale.h> /* Для функции setlocale и т.п. */ #include <string.h> #include <stdlib.h> #ifdef _GNU_SOURCE /* Переменная содержит "базовое" имя программы (basename) */ extern char *program_invocation_short_name; #else const char *program_name; #define program_invocation_short_name program_name #endif /* _GNU_SOURCE */ int main (int argc, char *argv[]) { char *locale = ""; char *start_locale, *current_locale; char *lang; #ifndef _GNU_SOURCE program_name = argv[0]; #endif if (argc < 2 ) fprintf (stderr, "%s: setting locale based on $LANG env value\n", program_invocation_short_name); else locale = argv[1]; /* Только для распечатки значения - setlocale сама делает getenv("LANG") */ lang = getenv ("LANG"); start_locale = setlocale (LC_ALL, NULL); if ((current_locale = setlocale (LC_ALL, locale)) == NULL) fprintf (stderr, "%s: failed to set locale %s (LANG=`%s')\n", program_invocation_short_name, locale, lang); else printf ("%s: start locale: `%s', current locale: `%s'\n", program_invocation_short_name, start_locale, current_locale); return 0; }
При компиляции программы с GNU glibc можно указать макрос, сигнализирующий о том, что вы хотите использовать GNU-расширения C-библиотеки, примерно так:
[user@host:~] gcc -D_GNU_SOURCE -Wall -O3 setlocale.c -o setlocale
Dmitry A. Antipov
1999-05-26