dedlfix: CSV import mit Umlauten

Beitrag lesen

Tach!

Das importieren an sich funktioniert auch, jedoch werden die Umlaute nicht richtig eingetragen. Ich hab jetzt schon mehrere Sachen ausprobiert, aber immer sind die Umlaute nicht richtig.

Damit kommt man auch nur zufällig an eine Lösung, die sich auch als "sieht nur so aus, als ob sie funktioniert" herausstellen kann. Zielgerichtetes Arbeiten sieht anders aus und setzt Grundlagenwissen voraus, in dem Fall zur Zeichenkodierung.

Was ich bis jetzt gemacht habe:

  • "SET NAMES 'utf8'" als 1. Query

Das teilt lediglich dem DBMS mit, dass man gedenkt, UTF-8-kodierte Daten zu schicken. Man muss dies natürlich auch tun, denn von allein wandelt sich weder mit dieser Deklaration noch sonstwie etwas nach UTF-8 um.

  • den kompletten String durch "utf8_encode" "geschleift"
  • nur die Teile wo auch Umlaute stehen durch "utf8_encode" "geschleift"

utf8_encode() ist auch keine Zauberfunktion, der man alles mögliche Undefinierte übergeben kann und die am Ende UTF-8 erzeugt. Stattdessen kann sie lediglich gemäß ISO-8859-1 kodierte Daten nach UTF-8 konvertieren.

Die Tabelle und die Spalten sind UTF-8 codiert.

Das ist zumindest eine Voraussetzung, damit UTF-8-Daten abgelegt werden können, nachdem sie den Transport zum DBMS hin korrekt absolviert haben. Die einzige "Magie", die dabei auftritt ist eine Umkodierung, falls du auf der Verbindung eine andere Kodierung ausgehandelt und diese dann auch tatsächlich verwendet hast, dann werden die Daten in das Format der Tabellenfelder umkodiert. Auch rückwärts beim Auslesen geschieht dies, wenn die Verbindungskodierung eine andere ist.

Hat jmd. eine Idee wie ich das Problem lösen kann?

Erstmal die Ursache ermitteln. Die Lösung hängt von dieser ab.

Wenn dir die Kodierung des CSV-Dokuments nicht bekannt ist, kannst du nur raten. Indizien können dabei helfen, den Kreis der möglichen Kodierungen einzuschränken. Ob es letztlich möglich ist, die wirkliche Kodierung herauszufinden, liegt daran, wie mehrdeutig sich deine Testdaten interpretieren lassen. Es gibt Kodierungen, die sind größtenteils ähnlich und unterscheiden sich nur in einzelnen Zeichen. Wenn du diese Unterschiede nicht herausfinden kannst, hast du eine potentielle Lücke im System, die sich erst später bemerkbar machen kann, wenn du dann diese Zeichen zum Verarbeiten übergeben bekommst.

Lass dir einen Teil der Daten ausgeben, der Nicht-ASCII-Zeichen enthält, zum Beispiel Umlaute. Das Euro-Zeichen kann als weiteres Indiz genommen werden, um die hierzulande üblichen Kodierung ISO 8859-15 und Windows-1252 zu unterscheiden. Auch andere "exotische" Zeichen liefern oftmals brauchbare Indizien.

Zur Testausgabe kann man sehr schön die Funktion urlencode() missbrauchen. Die lässt die Buchstaben und Ziffern unbeachtet, die im ASCII-Bereich liegen und alle gleich kodiert werden, und zeigt dir von den übrigen Zeichen die Bytewerte als Hex mit vorangestelltem % an.

Aus diesen Indizien kann man nun Rückschlüsse ziehen, welche Kodierung vorliegen könnte. Der Rest ist einfach - wenn man sich letztlich sicher ist - die passende Umkodierfunktion zu suchen und anzuwenden.

dedlfix.