Pour les fichiers en UNICODE, il me semble qu'ils débutent par 0xFEFF ou 0xFFFE, donc c'est pas trop compliqué (encore que, à ma connaissance, ca concerne l'UNICODE codé sur 2 octets (UTF-16?), alors que le jeu complet de l'UNICODE est codé sur 4 octets).
Pour détecter un fichier encodé en UTF-8, c'est plus compliqué, il faut détecter des séquences propres à l'UTF-8, genre 110xxxxx 10xxxxxx 10xxxxxx, en sachant qu'en UTF-8, tout octet > 127 ne peut que faire partie d'une séquence de ce type...C'est un peu chiant, mais comme l'UTF-8 est justement utilisé pour qu'un texte soit au moins partiellement lisible par un éditeur qui n'a pas prévu de décodage UTF-8, c'est à ma connaissance le seul moyen...
Pour passer d'un format à l'autre...
ASCII -> UNICODE sur 2 octets : 0x00nn avec nn code ascii
ASCII -> UTF-8, rien à faire
UTF-8 <-> UNICODE : cherche sur google les sources de tidy, c'est pas super compliqué, mais il faut avoir des notions de manipulations binaires...et cherche sur google des docs sur UTF-8 et UNICODE, il y'a des codes invalides en UNICODE etc...
voila, vérifie ces infos en tout cas, c'est juste pour te donner une idée, je te sors ca de mémoire donc...
bonne chance