【发布时间】:2022-01-11 15:37:24
【问题描述】:
我有一个 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 和CharsetConverter。我做了各种尝试,但结果和上面描述的一样。
注意:我目前在 linux 上使用 PHP 7.3。 php 服务器位于 nginx 代理后面的 docker 容器中(位于不同的 docker 容器中)。
【问题讨论】:
-
当(有意)混合编码时,您不能信任编辑器的渲染。我建议您只使用几个字符和一个hexadecimal editor 进行测试。另外,我建议阅读手册以了解这些功能的作用,因为某些名称和签名非常具有误导性。
-
在2022:阅读并关注UTF-8 Everywhere和UTF-8 all the way through
-
@JosefZ 不幸的是,问题是使用我们导出的文件的工具无法处理 utf-8,所以这不是一个选项。
标签: php csv utf-8 character-encoding thephpleague