ИМЯ
newlocale, freelocale - создаёт, изменяет и освобождает объект локалиLIBRARY
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);
Требования
макроса
тестирования
свойств
для glibc (см.
feature_test_macros(7)):
newlocale(), freelocale():
Since glibc 2.10: _XOPEN_SOURCE >= 700 Before glibc 2.10: _GNU_SOURCE
ОПИСАНИЕ
Функция newlocale() создаёт новый объект локали или изменяет существующий, возвращая ссылку на новый или изменённый объект. Значение base определяет что именно делает вызов — создаёт или изменяет существующий объект:- •
- Если base равно (locale_t) 0, то создаётся новый объект.
- •
- Если base ссылается на корректный существующий объект локали (т. е., объект, полученный ранее от вызовов newlocale() или duplocale(3)), то этот объект изменяется при вызове. При успешном выполнении содержимое base не определено (в частности, объект, на который ссылается base, может быть освобождён и создан новый объект). Поэтому вызывающий должен понимать до вызова newlocale(), что не использует base, и, следовательно, ссылаться на изменённый объект через ссылку, возвращённую функцией. При ошибке вызова, содержимое base остаётся корректным и не изменяется.
- "POSIX"
- Минимальное окружение локали для программ на языке Си.
- "C"
- Эквивалентно «POSIX».
- ""
- Определяемое реализацией родное окружение соответствует значениям переменных окружения LC_* и LANG (смотрите locale(7)).
freelocale()
Функция 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.ОШИБКИ
- EINVAL
- Один или более бит в category_mask не соответствуют корректной категории локали.
- EINVAL
- Значение locale равно NULL.
- ENOENT
- Значение locale не является указателем на строку, ссылающуюся на корректную локаль.
- ENOMEM
- Недостаточно памяти для создания объекта локали.
ВЕРСИИ
The newlocale() and freelocale() functions first appeared in glibc 2.3.СТАНДАРТЫ
POSIX.1-2008.ЗАМЕЧАНИЯ
Каждый объект локали, созданный newlocale(), должен освобождаться с помощью freelocale().ПРИМЕРЫ
Следующая программа принимает два аргумента командной строки, каждый из которых описывает локаль. Первый аргумент обязателен и используется для назначения категории LC_NUMERIC в объекте локали, создаваемой newlocale(). Второй аргумент необязателен; если он задан, то используется для назначения категории LC_TIME объекта локали. После создания и инициализации объекта, программа применяет его с помощью uselocale(3), а затем тестирует изменения локали:- (1)
- Выводит число с плавающей запятой с дробной частью. На результат будет влиять значение LC_NUMERIC. Во многих локалях европейских языков дробная часть числа отделяется от целой запятой, а не точкой.
- (2)
- Выводит дату. На формат и язык влияет значение LC_TIME.
$ ./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 <[email protected]>, Azamat Hackimov <[email protected]>, Dmitry Bolkhovskikh <[email protected]>, Yuri Kozlov <[email protected]> и Иван Павлов <[email protected]> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на [email protected]5 февраля 2023 г. | Linux man-pages 6.03 |