URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2658
[ Назад ]

Исходное сообщение
"Сравнение строк на C/C++"

Отправлено XMan , 14-Мрт-04 02:44 
Никто не подскажет, как сравнить две строки с учетом регистра и локали на C/C++ ?

Содержание

Сообщения в этом обсуждении
"Сравнение строк на C/C++"
Отправлено pth , 15-Мрт-04 07:54 
>Никто не подскажет, как сравнить две строки с учетом регистра и локали
>на C/C++ ?


strcoll


"Сравнение строк на C/C++"
Отправлено XMan , 15-Мрт-04 19:20 
strcoll сравнивает без учета регистра. То есть, "А" и "а" считаются одинкаковыми.

"Сравнение строк на C/C++"
Отправлено pth , 15-Мрт-04 19:25 
>strcoll сравнивает без учета регистра. То есть, "А" и "а" считаются одинкаковыми.
>

Кто тебе это сказал?

Ты проверял? Может локаль кривая?


"Сравнение строк на C/C++"
Отправлено XMan , 15-Мрт-04 21:38 
Исходники mc 4.6.0, 73-я строка файла src/dir.c:

---
g_strcasecmp() doesn't work well in some locales because it relies on
the locale-specific toupper().  On the other hand, strcoll() is case
sensitive in the "C" and "POSIX" locales, unlike other locales.
Solution: always use strcmp() for case sensitive sort.  For case
insensitive sort use strcoll() if it's case insensitive for ASCII and
g_strcasecmp() otherwise.
---

Второе предложение.

Собственно, я потому и спросил - при "case sensitive" используется strcmp, который ничего никогда про локаль не знает. Соответственно, в koi8 его алфавит выглядит примерно, как "юабвдефг..."

Проблему-то я порешал, но пришлось переводить строки в "wide character" и сравнивать уже это. Вместо одной строки strcmp появилось 25 строк перевода и сравнения :)