newlocale(3) | Library Functions Manual | newlocale(3) |
newlocale, freelocale - создаёт, изменяет и освобождает объект локали
Standard C library (libc, -lc)
#include <locale.h>
locale_t newlocale(int category_mask, const char *locale, locale_t base); void freelocale(locale_t locobj);
newlocale(), freelocale():
Since glibc 2.10:
_XOPEN_SOURCE >= 700
Before glibc 2.10:
_GNU_SOURCE
Функция newlocale() создаёт новый объект локали или изменяет существующий, возвращая ссылку на новый или изменённый объект. Значение base определяет что именно делает вызов — создаёт или изменяет существующий объект:
Если значение base равно специальному объекту локали LC_GLOBAL_LOCALE (смотрите duplocale(3)) или не равно (locale_t) 0 и это некорректный указатель объекта локали, то поведение не определено.
Аргумент category_mask представляет собой битовую маску, которая определяет категории локали, устанавливаемые в создаваемом объекте локали или в изменяемом существующем объекте. Маска создаёт побитовым OR из констант LC_ADDRESS_MASK, LC_CTYPE_MASK, LC_COLLATE_MASK, LC_IDENTIFICATION_MASK, LC_MEASUREMENT_MASK, LC_MESSAGES_MASK, LC_MONETARY_MASK, LC_NUMERIC_MASK, LC_NAME_MASK, LC_PAPER_MASK, LC_TELEPHONE_MASK и LC_TIME_MASK. Также значением маски может быть LC_ALL_MASK, которая эквивалентна сложению всех указанных ранее констант.
Для каждой категории, указанной в category_mask, данные локали из locale будут использованы в объекте, возвращаемом newlocale(). Если создаётся новый объект локали, то данные для всех категорий, не указанных в category_mask, берутся из локали по умолчанию («POSIX»).
Для всех категорий, которые можно указать в category_mask, уже определены следующие значения locale:
Функция freelocale() освобождает ресурсы, связанные с locobj, объектом локали, ранее полученным из вызова newlocale() или duplocale(3). Если значение locobj равно LC_GLOBAL_LOCALE или не является корректным объектом локали, то результат не определён.
После того, как объект локали освобождён, программа не должна больше его использовать.
On success, newlocale() returns a handle that can be used in calls to duplocale(3), freelocale(), and other functions that take a locale_t argument. On error, newlocale() returns (locale_t) 0, and sets errno to indicate the error.
The newlocale() and freelocale() functions first appeared in glibc 2.3.
POSIX.1-2008.
Каждый объект локали, созданный newlocale(), должен освобождаться с помощью freelocale().
Следующая программа принимает два аргумента командной строки, каждый из которых описывает локаль. Первый аргумент обязателен и используется для назначения категории LC_NUMERIC в объекте локали, создаваемой newlocale(). Второй аргумент необязателен; если он задан, то используется для назначения категории LC_TIME объекта локали.
После создания и инициализации объекта, программа применяет его с помощью uselocale(3), а затем тестирует изменения локали:
В следующих сеансах работы показан пример запуска программы.
Категории LC_NUMERIC присвоено fr_FR (французская):
$ ./a.out fr_FR 123456,789 Fri Mar 7 00:25:08 2014
Категории LC_NUMERIC присвоено fr_FR (французская), а категории LC_TIME — it_IT (итальянская):
$ ./a.out fr_FR it_IT 123456,789 ven 07 mar 2014 00:26:01 CET
Значению LC_TIME присвоена пустая строка, что приводит к получению настройки из переменных окружения (которые, в данном случае, равны mi_NZ, новозеландская маори):
$ LC_ALL=mi_NZ ./a.out fr_FR "" 123456,789 Te Paraire, te 07 o Poutū-te-rangi, 2014 00:38:44 CET
#define _XOPEN_SOURCE 700 #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
} while (0) int main(int argc, char *argv[]) {
char buf[100];
time_t t;
size_t s;
struct tm *tm;
locale_t loc, nloc;
if (argc < 2) {
fprintf(stderr, "Использование: %s лок1 [лок2]\n", argv[0]);
exit(EXIT_FAILURE);
}
/* Create a new locale object, taking the LC_NUMERIC settings
from the locale specified in argv[1]. */
loc = newlocale(LC_NUMERIC_MASK, argv[1], (locale_t) 0);
if (loc == (locale_t) 0)
errExit("newlocale");
/* If a second command-line argument was specified, modify the
locale object to take the LC_TIME settings from the locale
specified in argv[2]. We assign the result of this newlocale()
call to 'nloc' rather than 'loc', since in some cases, we might
want to preserve 'loc' if this call fails. */
if (argc > 2) {
nloc = newlocale(LC_TIME_MASK, argv[2], loc);
if (nloc == (locale_t) 0)
errExit("newlocale");
loc = nloc;
}
/* Apply the newly created locale to this thread. */
uselocale(loc);
/* Test effect of LC_NUMERIC. */
printf("%8.3f\n", 123456.789);
/* Test effect of LC_TIME. */
t = time(NULL);
tm = localtime(&t);
if (tm == NULL)
errExit("time");
s = strftime(buf, sizeof(buf), "%c", tm);
if (s == 0)
errExit("strftime");
printf("%s\n", buf);
/* Free the locale object. */
uselocale(LC_GLOBAL_LOCALE); /* So 'loc' is no longer in use */
freelocale(loc);
exit(EXIT_SUCCESS); }
locale(1), duplocale(3), setlocale(3), uselocale(3), locale(5), locale(7)
Русский перевод этой страницы руководства был сделан Alex Nik <rage.iz.me@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>
Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |