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

Re: strcoll, C, ru_RU.KOI8-R



Artem Chuprina wrote:

Vladimir Zolotykh -> debian-russian@lists.debian.org  @ 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


Reply to: