Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 120

Автор ΠΡ€Π½ΠΎΠ»ΡŒΠ΄ Роббинс

ΠŸΠΎΡ‡Ρ‚ΠΈ всС GNU вСрсии стандартных ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ Unix ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, особСнно Π½Π° систСмах GNU/Linux, установка этих ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… позволяСт Π²Π°ΠΌ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ систСмы[139].

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 β€” сортировка строк) сущСствуСт для сравнСния строк с использованиСм Π»ΠΎΠΊΠ°Π»ΠΈ:

#include <string.h> /* ISO Π‘ */


int strcoll(const char *s1, const char *s2);

Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅/Π½ΡƒΠ»Π΅Π²Ρ‹Π΅/ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ значСния, Ρ‡Ρ‚ΠΎ ΠΈ strcmp(). Π‘Π»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ch13-compare.c, ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ дСмонстрируСт Ρ€Π°Π·Π½ΠΈΡ†Ρƒ:

1  /* ch13-compare.с --- дСмонстрация strcmp() ΠΏΡ€ΠΎΡ‚ΠΈΠ² strcoll() */

2

3  #include <stdio.h>

4  #include <locale.h>

5  #include <string.h>

6

7  int main(void)

8  {

9  #define STRBUFSIZE 1024

10  char locale[STRBUFSIZE], curloc[STRBUFSIZE];

11  char left[STRBUFSIZE], right[STRBUFSIZE];

12  char buf[BUFSIZ];

13  int count;

14

15  setlocale(LC_ALL, ""); /* ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ локаль */

16  strcpy(curloc, setlocale(LC_ALL, NULL)); /* ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π΅ */

17

18  printf("--> "); fflush(stdout);

19  while (fgets(buf, sizeof buf, stdin) != NULL) {

20   locale[0] = '\0';

21   count = sscanf(buf, "%s %s %s", left, right, locale);

22   if (count < 2)

23    break;

24

25   if (*locale) {

26    setlocale(LC_ALL, locale);

27    strcpy(curloc, locale);

28   }

29

30   printf("%s: strcmp(\"%s\", \"%s\") is %d\n", curloc, left,

31    right, strcmp(left, right));

32   printf("%s: strcoll(\"%s\", \"%s\") is %d\n", curloc, left,

33    right, strcoll(left, right));

34

35   printf("\n--> "); fflush(stdout);

36  }

37

38  exit(0);

39 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ строки, состоящиС ΠΈΠ· Π΄Π²ΡƒΡ… сравниваСмых слов ΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉΡΡ для сравнСния. Если локаль Π΄Π°Π½Π°, ΠΎΠ½Π° становится локалью для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… элСмСнтов. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ с любой локалью, которая установлСна Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ.

Массив curloc сохраняСт Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ локаль для Π²Ρ‹Π²ΠΎΠ΄Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²; left ΠΈ right ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»Π΅Π²Ρ‹ΠΌ ΠΈ ΠΏΡ€Π°Π²Ρ‹ΠΌ сравниваСмыми словами (строки 10–11). ΠžΡΠ½ΠΎΠ²Π½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ составляСт Ρ†ΠΈΠΊΠ» (строки 19–36), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ строки ΠΈ выполняСт Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 20–23 Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ строку, locale инициализируСтся пустой строкой, Ссли Ρ‚Ρ€Π΅Ρ‚ΡŒΡ строка Π½Π΅ прСдусмотрСна.

Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 25–28 ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π½ΠΎΠ²ΡƒΡŽ локаль, Ссли ΠΎΠ½Π° ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π°. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ 30–33 выводят Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сравнСния, Π° строка 35 ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅Ρ‚ для дальнСйшСго Π²Π²ΠΎΠ΄Π°. Π’ΠΎΡ‚ дСмонстрация:

$ ch13-compare /* Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ */

--> ABC abc /* ВвСсти Π΄Π²Π° слова */

Π‘: strcmp("ABC", "abc") is -1 /* ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Ρ‡Π°Π»Π°ΡΡŒ Π² Π»ΠΎΠΊΠ°Π»ΠΈ "Π‘" */

Π‘: strcoll("ABC", "abc") is -1 /* Π’ Π»ΠΎΠΊΠ°Π»ΠΈ "Π‘" ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·-Ρ‚Ρ‹ */


--> ABC abc en_US /* Π‘Π»ΠΎΠ²Π° Ρ‚Π΅ ΠΆΠ΅, локаль "en_US" */

en_US: strcmp("ABC", "abc") is -1 /* strcmp() Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ */

en_US: strcoll("ABC", "abc") is 2 /* Ρ€Π΅Π·-Ρ‚Ρ‹ strcoll() измСнились' */


--> ABC abc en_US.UTF-8 /* Π‘Π»ΠΎΠ²Π° Ρ‚Π΅ ΠΆΠ΅, локаль "en_US.UTF-8" */

en_US.UTF-8: strcmp("ABC", "abc") is -1

en_US. UTF-8: strcoll("ABC", "abc") is 6

 /* Π”Ρ€ΡƒΠ³ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, всС Π΅Ρ‰Π΅ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ */


--> junk JUNK /* НовыС слова */

en_US.UTF-8: strcmp("junk", "JUNK") is 1 /* прСдыдущая локаль */

en_US.UTF-8: strcoll("junk", "JUNK") is -6

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ясно ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ strcmp() ΠΈ strcoll(). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ strcmp() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² соотвСтствии с числовыми значСниями символов, ΠΎΠ½Π° всСгда Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚ ΠΆΠ΅ самый Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚, strcoll() ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ сортировки, ΠΈ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ мСняСтся Π² соотвСтствии с локалью. ΠœΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ±Π΅ΠΈΡ… локалях en_US Π·Π°Π³Π»Π°Π²Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ΄ΡƒΡ‚ послС строчных.

Π—ΠΠœΠ•Π§ΠΠΠ˜Π•. БпСцифичСская для Π»ΠΎΠΊΠ°Π»ΠΈ сортировка строк являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ для сопоставлСния рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ. РСгулярныС выраТСния Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ символов Π²Π½ΡƒΡ‚Ρ€ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ со скобками, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ '[a-z]' ΠΈΠ»ΠΈ '["-/]'. Π’ΠΎΡ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠΉ конструкции (символы, числСнно Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ лишь для Π»ΠΎΠΊΠ°Π»Π΅ΠΉ Β«Π‘Β» ΠΈ Β«POSIXΒ»

Для Π»ΠΎΠΊΠ°Π»Π΅ΠΉ, Π½Π΅ ΡΠ²Π»ΡΡŽΡ‰ΠΈΡ…ΡΡ ASCII, Ρ‚Π°ΠΊΠΈΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ ΠΊΠ°ΠΊ '[a-z]' ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π·Π°Π³Π»Π°Π²Π½Ρ‹ΠΌ Π±ΡƒΠΊΠ²Π°ΠΌ, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ строчным! Π”ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ '["-/]' дСйствитСлСн Π² ASCII, Π½ΠΎ Π½Π΅ Π² "en_US.UTF-8".

Π”ΠΎΠ»Π³ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ пСрСносимым Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся использованиС классов символов POSIX, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ '[[:lower:]]' ΠΈ '[[:punct:]]'. Если Π²Π°ΠΌ каТСтся, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ выраТСния с Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ Π½Π° систСмах, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ старых систСмах, Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΈΡ…, Π±Π΅Π· измСнСния своСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π³Ρ€ΡƒΠ±ΠΎΠΉ силы ΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ пСрСчислСнии ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ символа Π²Π½ΡƒΡ‚Ρ€ΠΈ скобок. Π­Ρ‚ΠΎ нСприятно, Π½ΠΎ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.