Hallo Nico R.,
gut, d.h. deine CSV Datei ist nachweislich ANSI. D.h. sie kommt auch als ANSI-Bytefolge am Server an. Die nimmst Du mit fgetcsv auseinander, und dann speicherst Du die gefundenen Daten in der Datenbank.
An dieser Stelle bin ich nicht ganz sicher, was die DB tut, insbesondere dann, wenn die Datenbankverbindung oder die DB-Objekte UTF-8 sind. Das müsstest Du überprüfen.
- Die Codierung, mit der die DB-Verbindung hergestellt wird, kannst Du explizit setzen. Tust Du das nicht, verwendet mysqli einen Default, und du kannst mittels mysqli_get_charset() abfragen, was verwendet wird. Die Default-Codierung wird auf dem Server eingestellt, aber mit mysqli_set_charset() kannst Du sie ändern. Das solltest Du aber nicht leichtfertig tun.
- Die Codierung, mit der Du die Daten mit der Codierung an mysqli übergibst, muss zur Verbindungscodierung passen. Die korrekte Übersetzung von Verbindungscodierung in die Codierung der DB-Objekte übernimmt MYSQL/MariaDB intern. Du bekommst die Daten immer auch in der Codierung zurück, die für die Verbindung gesetzt ist.
Wenn Du die Daten mit einer anderen Codierung an die DB sendest, als die Verbindungscodierung erfordert, können alle möglichen Unfälle passieren. Es kann gut sein, dass Du dann UTF-8 Bytefolgen in deinen DB-Tabellen stehen hast, und DAS ist eine Tretmine, die jederzeit hochgehen kann.
Wie schon gesagt: optimal ist, wenn Verbindung und DB-Objekte Unicode-fähig sind. MYSQL verwendet utf8mb3 (Codepoints 0-65535) oder utf8mb4 (voller Unicode). Du musst dann nur ANSI-codierte Daten erstmal in UTF-8 konvertieren, bevor Du sie in der Datenbank speicherst. Du bekommst sie UTF-8-codiert zurück, und kannst sie dann ohne weitere Konvertierung (von htmlspecialchars abgesehen) zum Browser schicken, weil Du im Content-Type ja UTF-8 als Charset angegeben hast. Für Stringoperationen musst Du dann auch die mb_-Funktionen verwenden, die klassischen Stringoperationen von PHP können bei Multibyte-Zeichencodierungen jederzeit Datenschrott erzeugen.
Rolf
sumpsi - posui - obstruxi