Я хочу экспортировать некоторые данные со знаком фунта в файл CSV, и я добавляю спецификацию для правильного представления фунта. Я столкнулся с ситуацией, когда я пишу в поток вывода php php://output
Спецификация была где-то проигнорирована, чтобы в файле не было этих 3 байтов. Интересный факт, если вы дублируете строку спецификации (что-то вроде \xef\xbb\xbf\xef\xbb\xbf
) первые 3 байта будут проигнорированы и в файле останутся только последние 3 байта.
Это воспроизведение только для записи в выходной поток. Когда я пытался записать в реальном файле все работает, как ожидалось.
РЕДАКТИРОВАТЬ:
Чтобы уточнить мой вопрос. Может кто знает, почему так работает? И как я могу решить проблему без костылей, таких как дублирующаяся строка спецификации
РЕДАКТИРОВАТЬ:
Я использую Symfony 2.8 StreamedResponse. Так что код работает как
$f = fopen('php://output', 'r+');
fwrite($f, "\xef\xbb\xbf\xef\xbb\xbf"); // only 3 bytes will exists
// other code. fputcsv(...) .. fflush($f)
И файлы, с которыми я проверяю https://hexed.it/
Похоже, вот как работает алгоритм декодирования UTF-8 в браузерах, см. https://stackoverflow.com/a/42717677
Других решений пока нет …