如何强制使用ISO-8859-1编码而不是UTF-8进行文件保存

时间:2019-01-24 17:17:53

标签: php xml symfony encoding utf-8

我必须能够使用Publisher and Location下载xml文件(我知道ISO-8859-1更好,但是我们的合作伙伴对编码有严格的要求,我们不能强迫他更改他的政策)。

服务器背景

  • Google Chrome 71.0.3578.98(正式版本)(64位)
  • Ubuntu 16.04
  • nginx
  • php 7.2
  • Symfony 4.0.15

控制器返回带有正确字符集的响应:

UTF-8

看起来非常好(至少在Chrome DevTools中有正确的响应标头):

enter image description here

但是问题在于该文件以return (new Response($xml->content(), Response::HTTP_CREATED, ['Content-Type' => $xml->contentType()])) ->setCharset($xml->charset()); 编码存储在文件系统中。

UTF-8

,并且在浏览器中打开XML文件后,其呈现不正确:

$ file --mime test.xml 
test.xml: application/xml; charset=utf-8

姓氏必须为Müller,但显示错误。如果我将此文件的编码更改为预期的编码,则它显示正确:

<INSIGMA>
    <AktuarMed>
       <Person>
           <Name>Hans Müller</Name>
           <Surname>Müller</Surname>
           <Forename>Hans</Forename>
       </Person>
    </AktuarMed>
</INSIGMA>

TL; DR:问题是

为什么此文件完全以$ iconv -f UTF-8 test.xml -t ISO-8859-1 > test.xml $ file --mime test.xml test.xml: application/xml; charset=iso-8859-1 编码存储,如果服务器响应,则应使用utf-8字符集?

  • 我是否需要发送一些额外的标头来强制使用ISO-8859-1字符集下载文件?或
  • 浏览器是否默认行为?或
  • 它是否是操作系统的默认行为?

如何解决此问题以及应该在哪一步找到解决方案?

1 个答案:

答案 0 :(得分:1)

您可以尝试以下操作:

  1. 在gedit中创建应作为服务器响应的xml文件,在“另存为”中,在对话框底部选择适当的字符编码(ISO-8859-1)。
  2. 将文件放入nginx并通过某个URL(例如http://localhost/sample-response.xml或其他名称)进行访问(公开)。
  3. 使用浏览器访问它
  4. 确保在客户端正确(使用浏览器保存后)
  5. 以纯文本形式记录xml文件下载(访问)请求-响应日志(使用wireshark或tcpflow或其他内容)。
  6. 现在访问php应用程序以获取由您的php应用程序生成的xml文件,并记录其请求-响应日志,如步骤5所示。
  7. 使用文件比较工具(meld,kdiff3或其他工具)比较步骤5和6中的请求-响应日志

之后,您可能会看到问题出在哪里。