Nico R.: Zeichensatzproblem mit mysqli_fetch_all

Beitrag lesen

Hallo Rolf, hallo Martin,

ich antworte jetzt mal nur hier. Ja, den content-type gebe ich (bisher) nicht explizit an. Es handelt sich um ein Script, das eigentlich gar nichts ausgeben soll, ich mache da nur eine testweise Ausgabe in der Konsole. Das Setzen von header('Content-Type: text/html; charset=UTF-8') hat darüber hinaus keine Veränderung gebracht.

Ich habe den Übeltäter aber inzwischen ausfindig gemacht. Daher hier nochmal ganz kurz und vereinfacht die Aufgabe des Scripts: Über ein Formular wird eine CSV-Datei per JS/fetch an das Script gesendet. Dort werden die Daten per fgetcsv() eingelesen, untersucht usw. und in der DB gespeichert.

Und genau die CSV-Datei (die nicht von mir kommt) ist das Problem. Wenn ich die in Notepad öffne, wird mir als Zeichencode ANSI angezeigt. Wenn ich die Daten beim Einlesen testweise mit mb_detect_encoding() in der Konsole anzeige, wird bei "normalem" Text ohne Umlaute ASCII angezeigt. Sobald ein Wert mit z.B. einem ä (bzw. hier ä) kommt, lautet die Anzeige UTF-8.

Nun sind ja in ASCII keine Umlaute enthalten. Deswegen vielleicht die automatische Umschaltung auf UTF-8, die dann aber nicht passt, weil die Daten als ANSI gespeichert sind? Wie kommt der Server überhaupt auf ASCII? Wie könnte ich erreichen, dass hier ANSI verwendet wird, so wie auch die CSV-Datei vorliegt?

Wenn ich die CSV-Datei in Notepad nach UTF-8 konvertiere und einlese, werden die Umlaute korrekt dargestellt. mb_detect_encoding() startet dann bei einfachen Strings nach wie vor mit ASCII, bei Strings mit Umlauten wird auch wieder automatisch auf UTF-8 umgeschaltet, das funktioniert dann aber in diesem Fall.

Sämtliche scriptseitigen Versuche mit mb_convert_encoding() und iconv() in verschiedenen Kombinationen haben erstmal keinen Erfolg gebracht. Wäre das überhaupt der richtige Ansatz?

Schöne Grüße

Nico