ΠΠΎΡΡΠΈ Π²ΡΠ΅ 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:]]'. ΠΡΠ»ΠΈ Π²Π°ΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ, ΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ Ρ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΈ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΡΡΠ°ΡΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΠΈΡ , Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ²ΠΎΠ΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π³ΡΡΠ±ΠΎΠΉ ΡΠΈΠ»Ρ ΠΈ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡΠ°Π»ΡΠ½ΠΎΠΌ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π²Π½ΡΡΡΠΈ ΡΠΊΠΎΠ±ΠΎΠΊ. ΠΡΠΎ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎ, Π½ΠΎ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ.