【发布时间】:2019-06-18 12:19:38
【问题描述】:
我必须能够使用ISO-8859-1 下载xml 文件(我知道UTF-8 更好,但我们的合作伙伴对编码有严格的要求,我们不能强迫他改变他的政策)。
服务器背景:
- Google Chrome 71.0.3578.98(官方版本)(64 位)
- Ubuntu 16.04
- nginx
- php 7.2
- Symfony 4.0.15
控制器返回带有正确字符集的响应:
return (new Response($xml->content(), Response::HTTP_CREATED, ['Content-Type' => $xml->contentType()]))
->setCharset($xml->charset());
看起来非常好(至少在 Chrome DevTools 中有一个正确的响应头):
但问题是该文件以UTF-8 编码存储在文件系统中。
$ file --mime test.xml
test.xml: application/xml; charset=utf-8
XML 文件在浏览器中打开后呈现不正确:
<INSIGMA>
<AktuarMed>
<Person>
<Name>Hans Müller</Name>
<Surname>Müller</Surname>
<Forename>Hans</Forename>
</Person>
</AktuarMed>
</INSIGMA>
姓氏必须是 Müller,但显示错误。如果我将此文件的编码更改为预期的编码,则它会正确显示:
$ iconv -f UTF-8 test.xml -t ISO-8859-1 > test.xml
$ file --mime test.xml
test.xml: application/xml; charset=iso-8859-1
TL;DR:所以问题是
为什么这个文件完全用utf-8编码存储,如果服务器响应,应该使用ISO-8859-1字符集?
- 我是否需要发送一些额外的标头来强制下载带有
ISO-8859-1字符集的文件?或 - 它是浏览器的默认行为吗?或
- 它是操作系统的默认行为吗?
如何发现这个问题以及我应该在哪一步找到解决方案?
【问题讨论】:
-
什么是
$xml(见$xml->content()),它来自哪里? -
@Joni
$xml它是一个自定义实体。具有->content()方法(它以字符串形式返回xml内容)和->charset()方法(它返回ISO-8859-1字符串) .结果服务器返回一个有效的 XML 文件,但使用utf-8编码 -
它看起来像是在骗你:
content()返回 UTF-8 编码文本,而charset()告诉你它是 iso-8859-1。您可以使用 iconv (iconv("utf-8", "iso8859-1", $xml->content())) 在现场转换编码,但也许您更愿意从源头解决问题 -
@Joni,谢谢,这听起来是个好主意。但是现在它抛出了一个异常
Notice: iconv(): Detected an illegal character in input string -
@Joni,不幸的是,这没有帮助。
$xml->content()具有ISO-8859-1编码,但文件仍以utf-8保存
标签: php xml symfony encoding utf-8