Использование широких символов и многобайтовых функций:
int utf8len(char *str)
{
char *top=str+strlen(str);
int len;
for(len=0; str<top; len++)
str+=mblen(str, top-str);
return len;
}
int main()
{
setlocale(LC_ALL, "en_US.utf8");
char *w = "Artîsté";
printf("%lu\n", strlen(w));
int z, len = utf8len(w);
wchar_t wstr[len+1];
mbstowcs(wstr, w, len);
for(z=0; z<len; z++)
printf("%i: %lc\n", z, wstr[z]);
}
Вам повезло с первым printf, потому что вы никогда не меняли данные, после разделения символов ваш вывод уже не был utf8.