Frage

Ich habe ein einfaches Skript, das eine CSV -Datei akzeptiert und jede Zeile in ein Array liest. Ich fahre dann durch jede Spalte der ersten Zeile (in meinem Fall enthält sie die Fragen einer Umfrage) und drucke sie aus. Die Umfrage ist in Französisch und wenn der erste Charakter einer Frage ein besonderer Charakter ist (é, ê, ç usw.), lässt FGetCSV sie einfach aus.

Sonderzeichen in der Mitte des Wertes werden nur dann nicht betroffen, wenn sie der erste Charakter sind.

Ich habe versucht, das zu debuggen, aber ich bin verblüfft. Ich habe einen var_dump mit dem Inhalt der Datei gemacht und die Zeichen sind definitiv da:

var_dump(utf8_encode(file_get_contents($_FILES['csv_file']['tmp_name'])));

Und hier ist mein Code:

if(file_exists($_FILES['csv_file']['tmp_name']) && $csv = fopen($_FILES['csv_file']['tmp_name'], "r"))
    {
        $csv_arr = array();

        //Populate an array with all the cells of the CSV file
        while(!feof($csv))
        {
            $csv_arr[] = fgetcsv($csv);
        }

        //Close the file, no longer needed
        fclose($csv);

        // This should cycle through the cells of the first row (questions)
        foreach($csv_arr[0] as $question)
        {
            echo utf8_encode($question) . "<br />";
        }

    }
War es hilfreich?

Lösung

Haben Sie das bereits überprüft Manuelle Seite auf FGetCSV? Es gibt nichts, was über dieses spezifische Problem redet, aber eine Reihe von Beiträgen, die es wert ist, durchzuschauen, wenn hier nichts auftaucht.

Es gibt zum Beispiel das:

HINWEIS: Die Einstellung des Gebietsschemas wird durch diese Funktion berücksichtigt. Wenn Lang z. EG EN_US.UTF-8 ist, werden Dateien in der Ein-Byte-Codierung durch diese Funktion falsch gelesen.

Könnte dies auch sein, wie es immer am Anfang der Linie ist, dass dies wirklich ein Problem mit der versteckten Linie ist? Da ist das:

HINWEIS: Wenn PHP die Zeilenende nicht ordnungsgemäß erkennt, wenn Dateien auf einem Macintosh-Computer gelesen oder erstellt werden, kann die Laufzeit-Konfiguration Option auto_detect_line_endings dazu beitragen, das Problem zu beheben.

Möglicherweise möchten Sie auch versuchen, die Datei mit unterschiedlichen Zeilenenden zu speichern.

Andere Tipps

Stellen Sie Ihr Gebietsschema vor dem Anruf korrekt ein fgetcsv()?

setlocale(LC_ALL, 'fr_FR.UTF-8');

Andernfalls, fgetcsv() ist nicht mehrbyte sicher.

Stellen Sie sicher, dass Sie es auf etwas einstellen, das in Ihrer Liste der verfügbaren Orte angezeigt wird. Unter Linux (sicherlich auf Debian) können Sie dies sehen, indem Sie dies tun

locale -a

Du solltest so etwas wie ...

C
en_US.utf8
POSIX

Für UTF8 wählen Sie am Ende eine Codierung mit UTF8. Wenn Ihre Eingabe mit etwas anderem codiert ist, müssen Sie das entsprechende Gebietsschema verwenden, aber stellen Sie sicher, dass Ihr Betriebssystem es zuerst unterstützt.

Wenn Sie das Gebietsschema auf ein Gebietsschema einstellen, das nicht in Ihrem System verfügbar ist, hilft es Ihnen nicht.

Dieses Verhalten hat a Fehlerbericht eingereicht dafür, aber anscheinend es Ist kein Fehler.

Wir haben das gleiche Ergebnis mit gesehen LANG einstellen C, und arbeitete damit um, indem sie sicherstellten, dass solche Werte in Anführungszeichen eingewickelt wurden. Zum Beispiel die Linie

a,"a",é,"é",óú,"óú",ó&ú,"ó&ú"

erzeugt das folgende Array, wenn Sie durchlaufen werden fgetcsv():

array (
  0 => 'a',
  1 => 'a',
  2 => '',
  3 => 'é',
  4 => '',
  5 => 'óú',
  6 => '&ú',
  7 => 'ó&ú',
)

Natürlich müssen Sie allen Anführungszeichen im Wert entkommen, indem Sie sie verdoppeln, aber das ist viel weniger problematisch als die Reparatur der fehlenden Zeichen.

Seltsamerweise geschieht dies sowohl mit UTF-8- als auch mit CP1252-Codierungen für die Eingabedatei.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top