O UTF-8 tem várias armadilhas e, por essa razão, não é a codificação típica na Europa central.
Escrever programas que assumam UTF-8 é uma prática ruim, pois você pode nem saber onde um "caractere" termina no fluxo de bytes.
Um programa decente chama:
setlocale(LC_ALL, "")
na inicialização e depois usa funções como:
mbtowc(&wc, input, amt)
para converter a entrada multibyte de stdin ou arquivos.
Em seguida, ele processa os dados como caracteres amplos e os converte de volta para dados multibyte por meio de:
wctomc(output, wc)
a saída é impressa, por exemplo, stdout.