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!