我在PHP中通过标头发送正确的字符集信息时遇到问题。
在我的代码中,我创建了一个ISO-8859-2编码的CSV字符串。我使用以下代码(简化)将其输出到浏览器:
$csv = 'iso-8859-2 encoded string, Łukasz Szukała';
header('Content-Type: text/csv; charset=ISO-8859-2');
header('Content-Disposition: attachment; filename=report.csv');
echo $csv;
当使用编辑器(我正在使用Notepad ++)打开它时,生成的文件被检测为ISO-8859-1,因此显示不正确。
将字符串转换为UTF-8可按预期工作:
$csv = 'iso-8859-2 encoded string, Łukasz Szukała';
$csv = iconv('ISO-8859-2', 'UTF-8', $csv);
header('Content-Type: text/csv; charset=UTF-8');
header('Content-Disposition: attachment; filename=report.csv');
echo $csv;
在这种情况下,我甚至可以完全省略charset部分。
但是我需要将文件编码为ISO-8859-2,我不明白为什么标题信息不会导致文件被检测为ISO-8859-2。我也根据IANA(http://www.iana.org/assignments/character-sets/character-sets.xhtml)尝试了不同的别名,但我不能在任何浏览器中使用它。
非常感谢任何有价值的投入。
答案 0 :(得分:1)
除了您希望Notepad ++检测文件的字符集之外,您所做的一切都是正确的。 严格来说,ISO-8859-2不是编码而是字符集。
由编辑器(任何)打开的文件只是没有标题的纯文本,您发送到浏览器。因此编辑器可以检测到它是单字节编码,但检测字符集是不可能的,因此它在默认的系统字符集中打开。
有关编码检测的信息,请参阅my answer
您的文件仍然具有正确的编码,但Notepad ++只是错误地显示它。 UTF-8编码是另一回事,因为它没有字符集并且总是正确显示(我认为)。