Was die Umlaute betrifft, ist die Antwort "einfach".
Beim Auslesen werden diese nicht decodiert (warum auch immer), sondern einfach nur als
ANSI ausgelesen.
Am Ende wird das Nichtdecodierte aber nach UTF-8 codiert, welches dann dein Ergebnis zur Folge hat.