Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
#include <locale.h> /* ISO С */char *setlocale(int category, const char *locale);Аргумент
categorylocalelocale""setlocale()Если
localeNULLПоскольку каждая категория может быть установлена индивидуально, автор приложения решает, насколько будет программа использовать локаль. Например, если
main()setlocale(LC_TIME, ""); /* Использование локали только для времени и все */— тогда, независимо от установленных в окружении других переменных
LC_<i>xxx</i>setlocale(LC_TIME, "it_IT"); /* Время всегда итальянское */заменяет переменную окружения
LC_TIMELC_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()Однако, при наличии локалей простого числового сравнения недостаточно. Каждая локаль определяет для содержащихся в ней символов последовательность сортировки, другими словами, относительный порядок символов внутри локали. Например, в простом 7-битном ASCII у двух символов '
Ааint i = strcmp("А", "a");ien_US.UTF-8Aastrcmp()Функция
strcoll()#include <string.h> /* ISO С */int strcoll(const char *s1, const char *s2);Она возвращает такие же отрицательные/нулевые/положительные значения, что и
strcmp()ch13-compare.c1 /* ch13-compare.с --- демонстрация strcmp() против strcoll() */23 #include <stdio.h>4 #include <locale.h>5 #include <string.h>67 int main(void)8 {9 #define STRBUFSIZE 102410 char locale[STRBUFSIZE], curloc[STRBUFSIZE];11 char left[STRBUFSIZE], right[STRBUFSIZE];12 char buf[BUFSIZ];13 int count;1415 setlocale(LC_ALL, ""); /* установить локаль */16 strcpy(curloc, setlocale(LC_ALL, NULL)); /* сохранить ее */1718 printf("--> "); fflush(stdout);19 while (fgets(buf, sizeof buf, stdin) != NULL) {20 locale[0] = ' ';21 count = sscanf(buf, "%s %s %s", left, right, locale);22 if (count < 2)23 break;2425 if (*locale) {