Artem Chuprina wrote:
Vladimir Zolotykh -> [email protected] @ Thu, 01 Dec 2005
10:44:36 +0200:
VZ> Где можно задать "чисто" программистский вопрос?
VZ> Вопрос специфический по поводу strcoll и как она себя ведет в локалях
VZ> С и ru_RU.KOI8-R
VZ> Если debian-russian точно не эта группа просто не читай дальше.
VZ> такая вот простая функция
VZ> main(int argc, char * argv [])
VZ> {
VZ> if (argc > 1)
VZ> setlocale(LC_COLLATE, "ru_RU.KOI8-R");
VZ> else
VZ> setlocale(LC_COLLATE, "C");
VZ> printf("%d\n", strcoll("a-name", "aname"));
VZ> }
VZ> печатает -65 если вызвана без аргументов и 1 если с ними
VZ> Сколько ни думал, никакого разумного объяснения не придумал.
Ну а чего тут удивительного? В локали "C" AKA "порядок строго по коду
символа" минус (код 45) сортируется до n (код 110), а в человеческом языке
знаки препинания имеют все шансы следовать за буквами алфавита. Кстати,
подозреваю, не только в русском. Собери локаль en_US.ISO-8859-1 и
попробуй с ней. С шансами получишь то же самое.
Получить то получил, но яснее стало не на много.
strcoll("-", "b") < 0 в любой (C, ru_RU.KOI8-R, en_US.iso88591) локали
strcoll("a-bc", "abcd") < 0 тоже во всех локалях.
А вот
strcoll("a-bc", "abc") < 0 только в C,
в ru_RU и en_US "a-bc" > "abc",
где бы почитать про эти правила?
--
Vladimir Zolotykh