2012-11-08 2 views
9

Mit PHP 5.3 fgetcsv Funktion habe ich einige Probleme aufgrund der Codierung Angelegenheiten. Beachten Sie, dass diese Datei spanische "spezielle" lateinische Zeichen wie grafische Akzente á, é, í ï usw. hat.php fgetcsv - Zeichensatzcodierung Probleme

Ich bekomme die CSV-Datei, die einige strukturierte Daten exportiert, die ich in einer MS 2008 für Mac Excel-Datei habe.

Wenn ich es mit Mac OS X TextEdit Anwendung öffnen, scheint alles perfekt zu gehen.

Aber wenn ich zu meinem PHP-Programm komme und versuche, die CSV mit dieser fgetcsv PHP-Funktion zu lesen, bekomme ich es nicht, den Zeichensatz richtig zu lesen.

/** 
* @Route("/cvsLoad", name="_csv_load") 
* @Template() 
*/ 
public function cvsLoadAction(){ 
    //setlocale(LC_ALL, 'es_ES.UTF-8'); 
    $reader = new Reader($this->get('kernel')->getRootDir().'/../web/uploads/documents/question_images/2/41/masiva.csv'); 

    $i = 1; 
    $r = array("hhh" => $reader -> getAll()); 

    return new Response(json_encode($r, 200)); 
} 

Wie Sie sehen können, habe ich auch eine setlocale-es_ES.UTF-8 zu nutzen versucht. Aber nichts funktioniert.

Der Leseteil kommt hier:

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 

Sehen Sie, was ich in der $ row Variable nach jeder Zeile Lesen erhalten:

enter image description here

Diese ? Zeichen sein sollen Vokale mit Grafik Akzente auf ihnen.

Irgendwelche Hinweise drüben? Würde es funktionieren, wenn ich MS Excel für Windows verwende? Wie kann ich in der Laufzeit die exakte Kodierung der Datei erkennen und vor dem Lesen einstellen?

(Für jene spanischen Sprecher, erschrecken Sie nicht mit solchen schrecklichen medizinischen Sachen in diesen Texten;)).

+1

gleiche Problem. Eine UTF8-codierte CSV-Datei importiert die Daten auf einem Server, aber nicht auf dem anderen. Habe meinen eigenen CSV-Reader geschrieben. –

+0

FWIW, Sie können die Kodierung einer Datei nicht wirklich * kennen *, ohne es zu erfahren. Sie können raten, wenn Sie es lesen und entsprechend konvertieren, aber nichts ist so zuverlässig wie die Kodierung. – cmbuckley

+0

Danke cbuckley. Was meinst du mit "convert entsprechend", versuche es zu erraten und frage den Benutzer, ob er den Import genehmigt? Und wenn nicht, versuchen Sie es mit anderen Kodierungen für den Ursprung? – ElPiter

Antwort

28

Versuchen Sie googeln:

function convert($str) { 
    return iconv("Windows-1252", "UTF-8", $str); 
} 

public function getRow() 
{ 
    if (($row = fgetcsv($this->_handle, 10000, $this->_delimiter)) !== false) { 
     $row = array_map("convert", $row); 
     $this->_line++; 
     return $this->_headers ? array_combine($this->_headers, $row) : $row; 
    } else { 
     return false; 
    } 
} 
+2

+1. Hinweis zur [docs] (http://php.net/manual/en/function.fgetcsv.php): Wenn die Datei single-byte-codiert ist (z. B. CP1252), aber das Gebietsschema multibyte ist, tut dies fgetcsv nicht funktionieren wie erwartet. – cmbuckley

+0

Das war der eine !! :) Danke vielmals. Nur ein paar Kommentare: Zuerst müssen Sie die Funktion config deklarieren und in array_map als 'self: convert' abbilden; Zweitens war es in meinem Fall iconv ("macintosh", "UTF-8", $ str), da MS Excel für Mac OS mit Mac OS Roman nach CSV exportiert. Schließlich, obwohl dies eine großartige Antwort ist und mir wirklich geholfen hat, ist immer noch nicht alles, was meine Bedürfnisse löst, da ich nicht wissen werde, ob meine Benutzer eine Datei von einem Mac oder PC hochladen oder was auch immer ... weitere Hinweise darauf Wie erkennt man die Kodierung der hochgeladenen Datei? Danke noch einmal!! – ElPiter

+0

Sie müssen Heuristiken verwenden ..zuerst sehen Sie, ob es UTF-8 oder UTF-16 gültig ist, wenn nicht, bestimmen Sie PC/MAC (Von Benutzeragentenüberschrift) und benutzen Sie Windows-1252 für PC und Macintosh für Mac. Wenn der Benutzer kein lateinisches Skript verwendet, würden Sie natürlich Windows-1251 (Kyrillisch für Windows) und so weiter verwenden. Jemand muss dafür eine Bibliothek geschrieben haben: D – Esailija

0

Dies ist wahrscheinlich mit der Art, wie excel die Datei beim Speichern codiert.

Versuchen Sie, die .xls-Datei hochladen docs und das Herunterladen als CSV diese

+0

Ich habe es auch versucht, aber es geht noch schlimmer, denke ich. Trotzdem werde ich es nochmal versuchen. Danke für die schnelle Antwort. :) – ElPiter