PHP - EXCEL - Zeichensatzproblem
gnotterbald
- php
0 dedlfix
0 gnotterbald0 hotti0 Gnotterbald0 hotti
0 dedlfix
0 Gnotterbald0 dedlfix
Hallo,
ich lese mit PHP eine Excel-Datei ein und überführe die Daten dann (nachdem ich sie utf8_encoded habe) in eine MySQL-Datenbank.
In dem Excel-File gibt es eine Spalte "Beschreibung", in der Fliesstext enthalten ist. In diesen Texten sind für gewöhnlich Umlaute enthalten. Diese Umlaute werden dann in der DB auch korrekt angezeigt.
Nun habe ich folgendes Problem:
Bei zwei Texten in der Spalte Beschreibung, die sich von ihrer Struktur her von den anderen nicht unterscheiden, werden die Umlaute durch eigenartige Zeichen ersetzt. (Ersetzte ich diese betroffenen Texte durch andere, zu Testzwecken selbstgeschriebene, werden die Umlaute korrekt angezeigt).
Woran könnte das liegen, dass gerade diese beiden Texte dieser beiden Zeilen aus dem Excel - File Schwierigkeiten machen? Könnte es an der Art und Weise liegen, wie das Excel - File erstellt wurde?
Vielleicht hat jemand einen Hinweis für mich!
Viele Grüße
Gnotterbald
hinweis: die daten werden als utf8 eingelesen, nochmals utf8_encoded, alle dateien sind als utf8 abgespeichert
Hi!
ich lese mit PHP eine Excel-Datei ein und überführe die Daten dann (nachdem ich sie utf8_encoded habe) in eine MySQL-Datenbank.
Excel kann diverse Dateiformate speichern. Welches ist es konkret bei dir?
In dem Excel-File gibt es eine Spalte "Beschreibung", in der Fliesstext enthalten ist. In diesen Texten sind für gewöhnlich Umlaute enthalten. Diese Umlaute werden dann in der DB auch korrekt angezeigt.
Eine DB ist üblicherweise eine Blackbox. Um etwas anzuzeigen, muss man einen Client mit einer Abfrage beauftragen. Dabei kann einiges schiefgehen. Wie genau lässt du dir die Daten anzeigen? Allerdings ist diese Frage vermutlich belanglos, weil dein Problem das Interpretieren der Excel-Datei ist.
Bei zwei Texten in der Spalte Beschreibung, die sich von ihrer Struktur her von den anderen nicht unterscheiden, werden die Umlaute durch eigenartige Zeichen ersetzt. (Ersetzte ich diese betroffenen Texte durch andere, zu Testzwecken selbstgeschriebene, werden die Umlaute korrekt angezeigt).
"Eigenartige Zeichen" sind genauso nichtssagend wie "funktioniert nicht". Beschreibe bitte genauer, damit ein geübtes Auge die Chance hat, die konkreten Indizien zu bewerten.
Woran könnte das liegen, dass gerade diese beiden Texte dieser beiden Zeilen aus dem Excel - File Schwierigkeiten machen? Könnte es an der Art und Weise liegen, wie das Excel - File erstellt wurde?
Es kan an allem möglichen liegen. Beschreibe bitte, wie du die Datei einliest. Hast du dabei auch mal Kontrollausgaben der ausgelesenen Werte gemacht?
(Bitte keine Leerzeichen zwischen zusammengesetzte Wörter einfügen. Der alleinstehende Bindestrich sieht sonst aus wie ein Gedankenstrich und erschwert das Lesen.)
hinweis: die daten werden als utf8 eingelesen, nochmals utf8_encoded, alle dateien sind als utf8 abgespeichert
Das klingt nach einem Problem, wenn doppelt kodiert werden muss. Aussagekräftiger wäre jedoch eine konkretere Beschreibung. Auf MySQL bezogen könnte eine verwendbare Formulierung so aussehen: Die Felder sind auf die Kodierung xyz eingestellt, auf der Verbindung wird nach jedem Connect mit mysql(i)_set_charset() / SET NAMES / wasauchimmer die Kodierung xyz eingestellt.
PHP kann derzeit so etwas wie "als utf8 eingelesen" nicht. Es gibt nur einige wenige Funktionen, die mit UTF-8 umgehen können. Was konkret verwendest du? Und wenn du kontrolliert hast, was für Werte du verarbeitest, wie hast du das gemacht und was genau hast du dabei gesehen?
Lo!
hi
Excel kann diverse Dateiformate speichern. Welches ist es konkret bei dir?
weiss nicht, was du konkret meinst. Es handelt sich um eine schlichte Excel-Tabelle, deren Feldformate auf TEXT eingestellt sind.
Eine DB ist üblicherweise eine Blackbox. Um etwas anzuzeigen, muss man einen Client mit einer Abfrage beauftragen. Dabei kann einiges schiefgehen. Wie genau lässt du dir die Daten anzeigen? Allerdings ist diese Frage vermutlich belanglos, weil dein Problem das Interpretieren der Excel-Datei ist.
Ich schaue mir die Feldwerte in einem Programm namens PHPMYADMIN an.
"Eigenartige Zeichen" sind genauso nichtssagend wie "funktioniert nicht". Beschreibe bitte genauer, damit ein geübtes Auge die Chance hat, die konkreten Indizien zu bewerten.
Beispiel für einen von zwei Texten mit fehlerhaften Zeichen:
"Versteckt in einem angenehm duftenden Pinien- und Eukalyptuswald und direkt am türkisblauen Golf..."
nächste Zeile Text wieder richtig:
"Auch der Platz selbst ist recht groß, dank der vielen unterschiedlichen Bäume und Sträucher...."
Es kan an allem möglichen liegen. Beschreibe bitte, wie du die Datei einliest. Hast du dabei auch mal Kontrollausgaben der ausgelesenen Werte gemacht?
Ich benutze eine Klasse namens Excel-Reader
Kontrollausgaben habe ich natürlich gemacht, var_dump z.b. Das alles läuft auf der Shell.
Das klingt nach einem Problem, wenn doppelt kodiert werden muss. Aussagekräftiger wäre jedoch eine konkretere Beschreibung. Auf MySQL
Mysql-Felder: utf8_unicode_ci
[code lang=php] $this->objDb->query("SET NAMES 'utf8'"); //nutze prepared statements
Verwunderlich ist eben, dass es nur bei zwei von ca. tausend Fällen aus ein und demselben Excel-File auftritt.
hi,
Verwunderlich ist eben, dass es nur bei zwei von ca. tausend Fällen aus ein und demselben Excel-File auftritt.
Tja, so wies aussieht, ist die Tabelle schon in sich inkonsistent was die Zeichenkodierung angeht. Da hilft wahrscheinlich nur noch Handarbeit.
Hotte
hi,
Tja, so wies aussieht, ist die Tabelle schon in sich inkonsistent was die Zeichenkodierung angeht. Da hilft wahrscheinlich nur noch Handarbeit.
Hotte
ja, das vermute ich auch. Leider werden mir diese Dateien in der Form geliefert.
Gruss
Gnotter
hi,
Tja, so wies aussieht, ist die Tabelle schon in sich inkonsistent was die Zeichenkodierung angeht. Da hilft wahrscheinlich nur noch Handarbeit.
Hotte
ja, das vermute ich auch. Leider werden mir diese Dateien in der Form geliefert.
So wies aussieht isses auch zeilenweise. Das lässt sich bestimmt automatisieren, also wenns nicht kreuzweise ist.
Hotti
Hi!
Excel kann diverse Dateiformate speichern. Welches ist es konkret bei dir?
weiss nicht, was du konkret meinst. Es handelt sich um eine schlichte Excel-Tabelle, deren Feldformate auf TEXT eingestellt sind.
Wenn du mal den "Speichern unter"-Dialog ansiehst, wirst du unter "Dateityp" eine Liste mit sehr vielen Formaten finden. Das Dateiformat ist ja schon bei .xls je nach Version von Excel ein anderes. Zudem gibt es diverse Fremdformate (die wohl weniger in Betracht kommen), CSV, XML und einige Spezialfälle.
Ich schaue mir die Feldwerte in einem Programm namens PHPMYADMIN an.
Gut, daraus kann ich entnehmen, dass du mit ziemlicher Sicherheit das siehst, was MySQL auch sieht, denn der phpMyAdmin macht normalerweise keine Fehler beim Abfragen und Interpretieren.
"Eigenartige Zeichen" sind genauso nichtssagend wie "funktioniert nicht". Beschreibe bitte genauer, damit ein geübtes Auge die Chance hat, die konkreten Indizien zu bewerten.
Beispiel für einen von zwei Texten mit fehlerhaften Zeichen:
"Versteckt in einem angenehm duftenden Pinien- und Eukalyptuswald und direkt am türkisblauen Golf..."
Du hast UTF-8-kodierten Text vorliegen und betrachtest ihn als ISO-8859-1. Oder aber, der Text wurde einmal von ISO-8859-1 nach UTF-8 umkodiert und ein dann weiteres mal als ISO-8859-1 interpretiert und wieder nach UTF-8 umkodiert und du betrachtest ihn als UTF-8.
nächste Zeile Text wieder richtig:
"Auch der Platz selbst ist recht groß, dank der vielen unterschiedlichen Bäume und Sträucher...."
Hier stimmt die Kodierung des Textes mit der zur Interpretation verwendeten überein.
Es kan an allem möglichen liegen. Beschreibe bitte, wie du die Datei einliest. Hast du dabei auch mal Kontrollausgaben der ausgelesenen Werte gemacht?
Ich benutze eine Klasse namens Excel-Reader
Excel-Reader
Ich vermute, dass diese Klasse ein Problem hat und nicht korrekt mit Excels Dateien umgehen kann. Zum Probieren füllte ich unter Excel 2003 eine Tabelle mit ärger, 中国 und blöd 德国. Der Testcode sag so aus
$data = new Spreadsheet_Excel_Reader();
$data->setOutputEncoding('UTF-8');
$data->read('Mappe1.xls');
foreach($data->sst as $x)
var_dump(urlencode($x));
Das Ergebnis war:
string(7) "%E4rger"
string(18) "%E4%B8%AD%E5%9B%BD"
string(28) "bl%C3%B6d+%E5%BE%B7%E5%9B%BD"
Der ärger wurde demnach nicht als UTF-8 zurückgegeben, wohl aber die beiden anderen Werte. Wenn man sich die Excel-Datei in einem Hex-Editor ansieht, erkennt man schön, dass der ärger als ISO-8859-1 abgelegt wurde und die anderen beiden Felder als UTF16-LE. Excel kann diese beiden Fälle voneinander unterscheiden, der Excel-Reader offensichtlich nicht.
Eine Lösung kann ich nicht anbieten, nur Workaround-Vorschläge.
Die Excel-Datei als XML speichern, dann ist garantiert alles in UTF-8 abgelegt. Für das Auslesen eignen sich XML-Reader, die aber mit Namespaces umgehen können müssen.
Du versuchst das Ergebnis der Excel-Reader-Klasse zu untersuchen, ob sich die Werte als gültiges UTF-8 interpretieren lassen (Funktionen dazu stehen in den Nutzerkommentaren des PHP-Handbuchs, vorzugsweise bei den mit UTF-8 hantierenden Funktionen). Wenn nicht, musst du da eben explizit utf8_encode() anwenden. Es ergibt sich dann nur ein (wohl eher vernachlässigbares) Problem, wenn jemand wirklich türkisblau statt türkisblau meint und Excel das als ISO-8859-1 ausgibt, denn die beiden ISO-8859-1-Zeichen à und ¼ ergeben eben auch eine gültige UTF-8-Sequenz.
Lo!
hi, hab das Problem gelöst. Vielleicht kann mich einer aufklären. In den betroffenen Texten (in den Excel-Feldern) war jeweils ein Zeichen, dass so ähnlich aussieht, wie die PIPE, nur fett. Wenn ich dieses Zeichen z.b. hier in den Forumseditor kopieren will, wird daraus ein –, also ein Minuszeichen.
Lösche ich dieses Zeichen aus dem Text, und starte das Programm erneut, wird der Text richtig in die DB eingetragen.
Hi!
hi, hab das Problem gelöst.
So wie es sich anhört, hast du das Problem nicht gelöst, sondern nur bis zum nächsten Auftauchen eine Nicht-ISO-8859-1-Zeichen vertagt. Das kann schneller passieren, als du denkst, denn schon ein €-Zeichen beschert dir die gleichen Probleme. Und da wirst du nicht so schnell Ersatz finden (wenn du nicht gerade EUR draus machst).
Vielleicht kann mich einer aufklären. In den betroffenen Texten (in den Excel-Feldern) war jeweils ein Zeichen, dass so ähnlich aussieht, wie die PIPE, nur fett. Wenn ich dieses Zeichen z.b. hier in den Forumseditor kopieren will, wird daraus ein –, also ein Minuszeichen.
Es war auf alle Fälle ein Zeichen, das in ISO-8859-1 nicht vorkommt. Davon gibt es (neben dem €) noch eine Menge weitere, mit denen man auch unter normalen Umständen (also kein Beispiel-Chinesisch) in Berührung kommt. Beobachte mal, was Word in Standardkonfiguration mit den "-Anführungszeichen anstellt. Es werden die typografisch richtigen „ und “ draus. Diese Zeichen gibt es nicht in ISO-8859-1. Als Resultat wird diese Zelle dann in UTF-16LE gespeichert und du bekommt über den Excel-Reader UTF-8-kodierten Text statt des sonstigen ISO-8859-1.
Lösche ich dieses Zeichen aus dem Text, und starte das Programm erneut, wird der Text richtig in die DB eingetragen.
Das wird nicht immer funktionieren. Auf alle Fälle bleibt das Problem, gelegentlich händisch eingreifen zu müssen.
Lo!
hi,
ok, so langsam verstehe ich das Problem... danke dir für die Erklärung!