【问题标题】:How to force file saving with ISO-8859-1 encoding instead of UTF-8如何强制使用 ISO-8859-1 编码而不是 UTF-8 保存文件
【发布时间】: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-&gt;content()),它来自哪里?
  • @Joni $xml 它是一个自定义实体。具有-&gt;content() 方法(它以字符串形式返回xml 内容)和-&gt;charset() 方法(它返回ISO-8859-1 字符串) .结果服务器返回一个有效的 XML 文件,但使用 utf-8 编码
  • 它看起来像是在骗你:content() 返回 UTF-8 编码文本,而 charset() 告诉你它是 iso-8859-1。您可以使用 iconv (iconv("utf-8", "iso8859-1", $xml-&gt;content())) 在现场转换编码,但也许您更愿意从源头解决问题
  • @Joni,谢谢,这听起来是个好主意。但是现在它抛出了一个异常Notice: iconv(): Detected an illegal character in input string
  • @Joni,不幸的是,这没有帮助。 $xml-&gt;content() 具有 ISO-8859-1 编码,但文件仍以 utf-8 保存

标签: php xml symfony encoding utf-8


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

之后你可能会发现问题出在哪里。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 1970-01-01
    相关资源
    最近更新 更多