PHP Streaming CSV всегда добавляет UTF-8 BOM - PullRequest
2 голосов
/ 05 апреля 2010

Следующий код получает строку отчета в виде массива и использует fputcsv для преобразования ее в CSV. Все работает отлично, за исключением того факта, что независимо от используемой кодировки я помещаю бомбу UTF-8 в начало файла. Это очень раздражает, потому что A) я указываю iso и B) у нас много пользователей, использующих инструменты, которые показывают бомбу UTF-8 как символы мусора.

Я даже пытался записать результаты в строку, раздеть UTF-8 BOM, а затем повторить ее и все еще получить. Возможно ли, что проблема связана с Apache? Если я изменяю fopen на локальный файл, он просто пишет его без спецификации 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;

Ответы [ 2 ]

7 голосов
/ 05 апреля 2010

Полагаю, в вашем исходном файле php есть спецификация, и у вас включена выходная буферизация php.

0 голосов
/ 05 апреля 2010

Я не знаю, решает ли это вашу проблему, но вы пытались использовать функции print и implode для того же?

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)));
}

Это не проверено, но довольно очевидно.

...