Чтение онлайн

на главную - закладки

Жанры

Linux программирование в примерах
Шрифт:

$ export LС_NUMERIC=en_DK LC_TIME=C

 /* Европейские числа, дата и время по умолчанию */

$ gawk 'BEGIN { print 1.234 ; print strftime }'

 /* Вывести число, текущие дату и время */

1,234

Wed Jul 09 09:32:18 PDT 2003

$ export LC_NUMERIC=it_IT LC_TIME=it_IT

 /* Итальянские числа, дата и время */

$ gawk 'BEGIN { print 1.234 ; print strftime }'

 /*
Вывести число, текущие дату и время */

1,234

mer lug 09 09:32:40 PDT 2003

$ export LC_ALL=C /* Установить перекрывающую переменную */

$ gawk 'BEGIN { print 1.234 ; print strftime }'

 /* Вывести число, текущие дату и время */

1.234

Wed Jul 09 09:33:00 PDT 2003

Для

awk
стандарт POSIX констатирует, что числовые константы в исходном коде всегда используют в качестве десятичного разделителя '
.
' тогда как числовой вывод следует правилам локали).

Почти все GNU версии стандартных утилит Unix могут использовать локали. Таким образом, особенно на системах GNU/Linux, установка этих переменных позволяет вам контролировать поведение системы [139] .

139

Программисты, долгое время работавшие на С и Unix, могут предпочесть использовать локаль '

С
', даже если их родной язык английский, английские локали дают другой результат по сравнению с тем, что ожидают эти седые, понюхавшие пороху ветераны Unix — Примеч. автора.

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.3. Сравнение строк:

strcoll
и
strxfrm

Знакомая функция

strcmp
сравнивает две строки, возвращая отрицательное, нулевое или положительное значения, если первая строка меньше, равна или больше второй. Это сравнение основано на числовых значениях символов в машинном наборе символов. Из-за этого результаты
strcmp
никогда не изменяются.

Однако, при наличии локалей простого числового сравнения недостаточно. Каждая локаль определяет для содержащихся в ней символов последовательность сортировки, другими словами, относительный порядок символов внутри локали. Например, в простом 7-битном ASCII у двух символов '

А
' и '
а
' десятичные значения равны 65 и 97 соответственно. Соответственно, во фрагменте

int i = strcmp("А", "a");

i
имеет отрицательное значение. Однако, в локали "
en_US.UTF-8
" '
A
' идет после '
a
', а не перед ним. Таким образом, использование
strcmp
для приложений, использующих локаль, является плохой мыслью, мы могли бы сказать, что она возвращает игнорирующий локаль ответ.

Функция

strcoll
(string collate — сортировка строк) существует для сравнения строк с использованием локали:

Поделиться:
Популярные книги

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
7.17
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

"Фантастика 2024-107". Компиляция. Книги 1-21

Голд Джон
Фантастика 2024. Компиляция
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
рпг
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Фантастика 2024-107. Компиляция. Книги 1-21

Здравствуйте, я ваша ведьма! Трилогия

Андрианова Татьяна
Здравствуйте, я ваша ведьма!
Фантастика:
юмористическая фантастика
8.78
рейтинг книги
Здравствуйте, я ваша ведьма! Трилогия

Химическая свадьба

Vilriel
Проза:
современная проза
5.00
рейтинг книги
Химическая свадьба

Путь (2 книга - 6 книга)

Игнатов Михаил Павлович
Путь
Фантастика:
фэнтези
6.40
рейтинг книги
Путь (2 книга - 6 книга)

Ребус старого пирата

Бабкин Борис Николаевич
Приключения:
прочие приключения
5.00
рейтинг книги
Ребус старого пирата

Всадник на белом коне. Трилогия

Морозевич Юрий В.
Всадник на белом коне
Фантастика:
научная фантастика
космическая фантастика
5.00
рейтинг книги
Всадник на белом коне. Трилогия

Точка Бифуркации V

Смит Дейлор
5. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Точка Бифуркации V

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Хроники Максима. Трилогия

Бадей Сергей
Фантастика:
юмористическое фэнтези
8.26
рейтинг книги
Хроники Максима. Трилогия

Инновационная сложность

Колектив "Правова група "Домініон"
Детские:
детская образовательная литература
5.00
рейтинг книги
Инновационная сложность

Робин Уильямс. Грустный комик, который заставил мир смеяться

Ицкофф Дэйв
Иконы кино. Биографии великих деятелей кинематографа
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Робин Уильямс. Грустный комик, который заставил мир смеяться

Полный медицинский справочник диагностики

Вяткина П.
Полный медицинский справочник
Научно-образовательная:
медицина
6.33
рейтинг книги
Полный медицинский справочник диагностики

Одинокий волк. Жизнь Жаботинского. Том 1

Кац Шмуэль
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Одинокий волк. Жизнь Жаботинского. Том 1