Почему вот такая штука: #include <stdio.h> #include <stdlib.h> #include <locale.h> #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include <wchar.h> int compare(const void * ws1, const void * ws2); int main(void) { wchar_t * ws; setlocale(LC_ALL, ""); ws = wcsdup((wchar_t *)L"аАбБкКёЁеЕфФ"); if (ws == NULL) exit(1); qsort(ws, wcslen(ws), sizeof(wchar_t), compare); printf ("ws=[%ls]\n", ws); free(ws); return 0; } int compare(const void * ws1, const void * ws2) { return wcscasecmp((wchar_t *)ws1, (wchar_t *)ws2); } выдаёт ws=[аАбБЕекКФфЁё] вместо ws=[аАбБеЕёЁкКфФ]? Точнее: - почему аА, но Ее? - почему ё унесло в самый конец? Дистрибутив Slackware 12.1, локаль ru_RU.utf8. P.S. Кстати, не могу понять, откуда ругань: $ gcc -Wall ./sort.c ./sort.c: В функции ‘main’ ./sort.c:18: предупреждение: implicit declaration of function ‘wcsdup’ ./sort.c:18: предупреждение: assignment makes pointer from integer without a cast ./sort.c: В функции ‘compare’ ./sort.c:30: предупреждение: implicit declaration of function ‘wcscasecmp’ Однако g++ -Wall ./sort.c никаких предупреждений не даёт.