Вдогонку. Что характерно в perl, не работает без костылей из use utf8. Вот такие они студенческие поделки. Что самое смешное, чтоб писать нормально, без казусов, ничего сверхестесственного не нужно. Все стандартные средства работают без проблем:
$ ./a.out
original: Питон -- ПОДЕЛКА студентов!
lower: питон -- поделка студентов!
lower: ПИТОН -- ПОДЕЛКА СТУДЕНТОВ!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
#include <wctype.h>
wchar_t *modify(wchar_t *wstr, wint_t (*func)(wint_t wc))
{
int i;
wchar_t *r=wcsdup(wstr);
if (!r) return NULL;
for (i=0; i<wcslen(wstr); i++)
r[i]=func(wstr[i]);
return r;
}
wchar_t *lower(wchar_t *wstr) {
return modify(wstr, towlower);
}
wchar_t *upper(wchar_t *wstr) {
return modify(wstr, towupper);
}
int main(int argc, char *argv[])
{
wchar_t *s, *t;
setlocale(LC_ALL, "");
if (argc <= 1) s=L" -- !";
else {
size_t n;
s=malloc((n=mbstowcs(NULL, argv[1], 0)+1, n)*sizeof(wchar_t));
if (!s) perror(""), exit(1);
mbstowcs(s, argv[1], n);
}
printf("original: %ls\n", s);
printf("lower: %ls\n", (t=lower(s), t)), free(t);
printf("lower: %ls\n", (t=upper(s), t)), free(t);
return 0;
}