Workaround f├╝r PHP Bug #43225

In PHP gibt es einen Bug, der dazu f├╝hrt, dass die Funktion fputcsv unter Umst├Ąnden fehlerhaftes CSV generiert, welches dann von Programmen nicht mehr eingelesen werden kann.

Der Fehler tritt auf, wenn in einem Feldwert ein Backslash \ vorkommt, der direkt von einem doppelten Anf├╝hrungszeichen " („double quote“) gefolgt wird. Ein Beispiel:

$data = [
    'CMXINV',
    '-1001338',
    'Some string data here: "quoted text // highlight string \\\\" and "foo" bar',
    'baz'
];

Hier folgt auf die zwei Backslashes[1] direkt ein doppeltes Anf├╝hrungszeichen.

Erzeugt man aus dem $data-Array mit fputcsv eine CSV-Zeile, erwartet man folgende Ausgabe:

CMXINV;-1001338;"Some string data here: ""quoted text // highlight string \\"" and ""foo"" bar";baz

Tats├Ąchlich erh├Ąlt man aber:

CMXINV;-1001338;"Some string data here: ""quoted text // highlight string \\" and ""foo"" bar";baz

Bei genauem Hinschauen erkennt man, dass hinter den beiden Backslashes nur ein doppeltes Anführungszeichen steht, obwohl es zwei sein sollten[2].

Dieses Verhalten ist als PHP Bug 43225 bereits 2007 dokumentiert worden und wurde bis heute nicht korrigiert.

Ich setze fputcsv┬áin meiner Open Source Library f├╝r Collmex ein. Jegliche Kommunikation mit der Collmex-API geschieht ├╝ber das Senden und Empfangen von Nachrichten im CSV-Format. Bei einem Projekt trat nun der Fall auf, dass in einem Feld tats├Ąchlich Backslashes vor doppelten Anf├╝hrungszeichen standen und Collmex den erzeugten fehlerhaften Datensatz nicht lesen konnte. Ich habe jetzt einen Workaround in der Collmex-Library eingebaut, mit der dieser spezielle Fehler nicht mehr auftritt.

Der Workaround macht nichts anderes als vor dem Aufruf von fputcsv tempor├Ąr einen String zwischen Backslash und doppeltem Anf├╝hrungszeichen einzuf├╝gen und ihn nach dem Erzeugen der CSV-Daten wieder zu entfernen. Die Details lassen sich in der betreffenden Quelldatei bei Github ansehen.


[1] Es sind hier vier Backslashes zu sehen, weil das Backslash-Zeichen zum „escapen“ benutzt wird und selbst auch escaped werden muss – durch einen weiteren Backslash.
[2] ├ähnlich wie bei [1] muss ein doppeltes Anf├╝hrungszeichen durch ein weiteres doppeltes Anf├╝hrungszeichen „escaped“ werden, wenn die Feldwerte durch ein doppeltes Anf├╝hrungszeichen eingeschlossen werden.

Ver├Âffentlicht von

Marcus Jaschen

Ich bin selbstst├Ąndiger Webentwickler und Systemadministrator und bin unter anderem f├╝r MTB-News.de, Europas gr├Â├čte Mountainbike-Website t├Ątig. Meine freie Zeit verbringe ich mit Radsport, in der (Holz-)Werkstatt und mit Fotografie.