Eu escrevi um híbrido C / C ++ que faz a parte de tradução (não renomeia nada, apenas converte sequências de bytes ruins em boas). Você pode baixá-lo usando o link no final deste post.
O arquivo de entrada é decodificado como um fluxo UTF-8 em uma seqüência de posição de código UNICODE que NÃO é convertida em nenhuma outra página de códigos. Todas as posições de código estão abaixo de 256, elas representam a sequência de bytes da string UTF-8 original. Então eu apenas escrevo essas posições de código como bytes para a saída. O resultado é uma string UTF-8 correta. Ainda não é uma aplicação para o meu problema, mas o núcleo da solução.
O programa é escrito e testado no Linux, mas deve funcionar em qualquer sistema operacional. Exemplo de uso:
nil@hippy:~/playground/c++$ g++ utf8decode.cpp -o utf8decode
nil@hippy:~/playground/c++$ cat > file
Kispál és a Borz - 02 - Tökéletes Helyettes
nil@hippy:~/playground/c++$ cat file | ./utf8decode
Kispál és a Borz - 02 - Tökéletes Helyettes
Characters found: 48
nil@hippy:~/playground/c++$
Eu escrevi um contador de caracteres UTF-8 antes e modifiquei isso. Eu não escrevi o programa inteiro em uma hora. Fonte: link link