Victor Wagner wrote:
Vladimir Zolotykh <[EMAIL PROTECTED]> wrote:
: Где можно задать "чисто" программистский вопрос?
: Вопрос специфический по поводу strcoll и как она себя ведет
в локалях
: С и ru_RU.KOI8-R
: Если debian-russian точно не эта группа просто не читай
дальше.
: такая вот простая функция
: main(int argc, char * argv [])
: {
: if (argc > 1)
: setlocale(LC_COLLATE, "ru_RU.KOI8-R");
: else
: setlocale(LC_COLLATE, "C");
: printf("%d\n", strcoll("a-name", "aname"));
: }
: печатает -65 если вызвана без аргументов и 1 если с ними
: Сколько ни думал, никакого разумного объяснения не придумал.
: Все из Sarge.
В локали C небуквенные символы при сравнении учитываются, а в ru_RU -
нет.
Кстати, рекомендую попробовать еще и в en_US локали. Эффект будет тот
же, что и в ru_RU
Все национальные локали базируются на iso14651_t1, в которой про -
написано:
<U002D> IGNORE;IGNORE;IGNORE;<U002D> # 37 -
Более или менее начинаю понимать, хотя не скажу чтобы
по содержимому iso14651_t1 можно было сразу понять что к чему.
Вот например строчки, как их понимать?
<U0041> <a>;<BAS>;<CAP>;IGNORE # 319 A
........
<U0042> <b>;<BAS>;<CAP>;IGNORE # 330 B
Как на основании этих двух строк видно, что ``a'' должен
предшествовать ``b''? Другими словами, какой формат этих сток ?
А C тупо сортирует по ASCII кодам.
Поэтому в русской (и английской) локали файлы A a B b отсортируются именно
в таком порядке, а в C - A B a b
--
Vladimir Zolotykh