首页 > 解决方案 > 如何强制使用 ISO-8859-1 编码而不是 UTF-8 保存文件

问题描述

我必须能够xml下载文件ISO-8859-1(我知道,这UTF-8要好得多,但我们的合作伙伴对编码有严格的要求,我们不能强迫他改变他的政策)。

服务器背景

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

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应该使用那个字符集?

如何发现这个问题以及我应该在哪一步找到解决方案?

标签: phpxmlsymfonyencodingutf-8

解决方案


您可以尝试以下方法:

  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. 将步骤 5 和 6 中的请求-响应日志与文件比较工具(meld、kdiff3 或其他工具)进行比较

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


推荐阅读