Mag sein. Aber der Umlaut wird schon falsch im Array gespeichert. Das habe ich mit strlen() geprüft, was für den Umlaut zwei Zeichen statt eines ergibt. Oder wird ein UTF-8-Umlaut mit zwei Bytes gespeichert?
Durch Einfügen von header('Content-Type: text/html; charset=utf-8'); wird immerhin der Umlaut richtig ausgegeben, hast in dem Punkt recht. Bleibt nur die Zerstückelung.