[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: strcoll, C, ru_RU.KOI8-R



Victor Wagner wrote:

Vladimir Zolotykh <gsmith@eurocom.od.ua> 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


Reply to: