我有一个 PHP 应用程序,它使用League/csv生成一个简单的 CSV 文件。某些列包含可能具有非 ANSI 值的名称/地址。我的客户要求对输出 CSV 文件进行编码,iso-8859-1
而不是utf-8
像现在这样。
我相信我的问题可以归结为以下问题(response
来自 laravel):
$headers = [
'Content-type' => "text/csv; charset=iso-8859-1",
'Content-Disposition' => 'attachment; filename="CLI.csv"'
];
return response()->stream(function() {
$fh = fopen('php://output', 'wb');
fwrite($fh, "Vià Cittè\n");
fwrite($fh, mb_convert_encoding("Vià Cittè\n", 'iso-8859-1'));
fwrite($fh, mb_convert_encoding("Vià Cittè\n", 'iso-8859-1', 'utf-8'));
fwrite($fh, iconv('utf-8', 'iso-8859-1', "Vià Cittè\n"));
fwrite($fh, utf8_decode("Vià Cittè\n"));
fwrite($fh, utf8_encode("Vià Cittè\n"));
fclose($fh);
}, 200, $headers);
我希望至少有一些行以Vià Cittè\n
iso-8859-1 编码,但它们最终都错了。这是我使用 iso-8859-1 作为编码打开输出文件时看到的内容:
由于某种原因,输出似乎被重新编码为 utf-8。
有人可以告诉我如何避免出现这种重新编码问题吗?
在我的真实代码中,我不是直接使用 编写的fopen
,而是将 League/csv 与它的Writer
and一起使用CharsetConverter
。我进行了各种尝试,但结果与上述相同。
注意:我目前在 linux 上使用 PHP 7.3。php 服务器位于 nginx 代理(位于不同的 docker 容器中)后面的 docker 容器内。