13.2.2. Установка локали: setlocale()
Как уже упоминалось, если вы ничего не делаете, программы на С и библиотека С ведет себя так, как если бы использовалась локаль «С». Функция setlocale()
#include
char *setlocale(int category, const char *locale);
Аргумент category
locale является строкой, именующей используемую для этой категории локаль. Когда locale является пустой строкой (""), setlocale() проверяет соответствующие переменные окружения.Если locale
NULL, сведения о локали не изменяются. Вместо этого функция возвращает строку, представляющую текущую локаль для данной категории.Поскольку каждая категория может быть установлена индивидуально, автор приложения решает, насколько будет программа использовать локаль. Например, если main()
setlocale(LC_TIME, "");
/* Использование локали только для времени и все */
— тогда, независимо от установленных в окружении других переменных LC_
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()
strdup()»).13.2.3. Сравнение строк: strcoll()
strxfrm()Знакомая функция strcmp()
strcmp() Однако, при наличии локалей простого числового сравнения недостаточно. Каждая локаль определяет для содержащихся в ней символов
А' и 'а' десятичные значения равны 65 и 97 соответственно. Соответственно, во фрагментеint i = strcmp("А", "a");
i
en_US.UTF-8" 'A' идет a', а не перед ним. Таким образом, использование strcmp() для приложений, использующих локаль, является плохой мыслью, мы могли бы сказать, что она возвращает игнорирующий локаль ответ.Функция strcoll()
#include
int strcoll(const char *s1, const char *s2);
Она возвращает такие же отрицательные/нулевые/положительные значения, что и strcmp()
ch13-compare.c, интерактивно демонстрирует разницу:1 /* ch13-compare.с --- демонстрация strcmp() против strcoll() */
2
3 #include
4 #include
5 #include
6
7 int main(void)
8 {
9 #define STRBUFSIZE 1024
Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов
Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT