php - 如何强制使用 ISO-8859-1 编码而不是 UTF-8 保存文件
问题描述
我必须能够xml
下载文件ISO-8859-1
(我知道,这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
字符集的文件?或者 - 它是浏览器的默认行为吗?或者
- 它是操作系统的默认行为吗?
如何发现这个问题以及我应该在哪一步找到解决方案?
解决方案
您可以尝试以下方法:
- 在 gedit 中创建应作为服务器响应的 xml 文件,在对话框底部的“另存为”中选择正确的字符编码 (ISO-8859-1)。
- 将文件放入 nginx 并通过某个 URL(如http://localhost/sample-response.xml或其他)访问(公共)。
- 使用浏览器访问它
- 确保它在客户端正确(使用浏览器保存后)
- 将 xml 文件下载(访问)请求-响应日志(使用 wireshark 或 tcpflow 或其他)记录为纯文本。
- 现在访问 php 应用程序以获取由您的 php 应用程序生成的 xml 文件并记录其请求-响应日志,如步骤 #5
- 将步骤 5 和 6 中的请求-响应日志与文件比较工具(meld、kdiff3 或其他工具)进行比较
之后,您可能会看到问题出在哪里。
推荐阅读
- android - 如何在 Kotlin 扩展函数中使用泛型
- python - Telegram Python Bot,它使用命令中的参数解释某些首字母缩略词
- heroku - 如何将 webhook 部署到 Heroku?
- amazon-s3 - 使用 s3 连接的 EKS 上的 Airflow 1.10.6 kubernetes 执行器,任务通过测试但 dag 运行失败
- pandas - Pandas - 比较两个数据框并查找已更改的行
- spring - Gitlab CI无法将spring应用程序连接到postgres
- laravel - 在 laravel 5 中设置应用程序时出错
- echarts - 为什么会出现 Echarts 区域重叠错误?
- swift - Bundle.main.appStoreReceiptURL 在 watchOS 7 Beta 4 中返回 nil
- function - 这个本地函数可以在范围外访问,有什么解释吗?