PHP Streaming CSV siempre añade BOM UTF-8
-
24-09-2019 - |
Pregunta
El siguiente código obtiene una 'línea de informe' como una matriz y usos fputcsv a tranformar en CSV. Todo está funcionando genial, excepto por el hecho de que, independientemente del uso conjunto de caracteres I, se está poniendo una BOM UTF-8 en el principio del archivo. Esto es excepcionalmente molesto porque A) Yo estoy especificando iso y B) Tenemos un montón de usuarios que utilizan herramientas que muestran la lista de materiales UTF-8 como caracteres de basura.
Yo incluso han intentado escribir los resultados en una cadena, pelar el BOM UTF-8 y luego echo'ing hacia fuera y todavía conseguirlo. ¿Es posible que el problema reside con Apache? Si cambio la fopen en un archivo local que lo escribe muy bien sin la BOM UTF-8.
header("Content-type: text/csv; charset=iso-8859-1");
header("Cache-Control: no-store, no-cache");
header("Content-Disposition: attachment; filename=\"report.csv\"");
$outstream = fopen("php://output",'w');
for($i = 0; $i < $report->rowCount; $i++) {
fputcsv($outstream, $report->getTaxMatrixLineValues($i), ',', '"');
}
fclose($outstream);
exit;
Solución
Mi conjetura sería que el archivo de código fuente de PHP tiene una lista de materiales, y ha habilitado búferes de salida de PHP.
Otros consejos
No sé si esto resuelve su problema, pero han intentado utilizar las funciones de impresión e implosionan a hacer lo mismo?
header("Content-type: text/csv; charset=iso-8859-1");
header("Cache-Control: no-store, no-cache");
header("Content-Disposition: attachment; filename=\"report.csv\"");
for($i = 0; $i < $report->rowCount; $i++) {
print(implode(',',$report->getTaxMatrixLineValues($i)));
}
Eso no está probado, pero bastante obvio.