【问题标题】:UTF-8 BOM added to downloaded fileUTF-8 BOM 添加到下载的文件
【发布时间】:2013-05-13 14:08:12
【问题描述】:

我在 Windows Server 2012 上使用 PHP 和 IIS 8。我在服务器上创建了一个 UTF-8 编码文件,然后使用以下代码将其推送到客户端:

                // Start upload to client
                $fullPath = $full_name;
                $fsize = filesize($fullPath);
                $path_parts = pathinfo($fullPath);
                $ext = strtolower($path_parts["extension"]);
                header("Content-type: application/octet-stream");
                header("Content-Disposition: attachment; filename=\"".$file_name."\"");
                header("Content-length: $fsize");
                header("Cache-control: private");
                readfile($full_name);

当客户端收到文件时,它包含一个起始 BOM 并且(哦,令人惊讶)文件末尾缺少 3 个字符。我已经检查了服务器上的文件,它被正确保存在那里(没有保存 BOM 并且三个丢失的字符在那里)。

创建和上传文件的 PHP 脚本有标题

header('Content-Type:text/html; charset=UTF-8');

我已经在文件末尾添加了 3 次“换行符”来获取三个缺失的字符。我也可以为变量 $fsize 添加 +3,但我觉得做这种作弊不太舒服(它可能会反击)。我认为应该有一个更优雅的方法来解决这个问题。

奇怪的是,我在装有 IIS 7.5 的 Win7 机器上使用了相同的代码,并且添加 UTF-8 BOM 没有问题。 PHP目录是Win7机器上目录的副本,包括php.ini文件。

有人能看到我错过了什么吗?

提前感谢您的帮助。

【问题讨论】:

  • 不要以application/octet-stream 发送文本。以文本形式发送。
  • 最后 3 个字符被删除,因为您发送了正确的 Content-Length 标头(没有 bom)& 浏览器在到达它后会剪切所有内容。
  • 谢谢马特,这是合理的,因为我只是发送文本。我刚刚更改了我的代码,但仍在添加 BOM。
  • 谢谢 pozs,这就是我的想法,这就是为什么我在文件末尾添加三个额外的“换行符”:只是为了获取三个缺失的字符。我正在寻找比这更优雅的解决方案。

标签: php iis utf-8


【解决方案1】:

您也应该检查脚本文件中的 BOM。通常如果你的 IDE 用 BOM 保存 UTF-8 文件,它在开头的<?php 标签之前,所以 php 将其视为输出。

【讨论】:

  • 恐怕这也不是原因,我正在使用 TextPad。我强迫它不要为 UTF-8 文件编写 BOM。我也检查了那个。
  • 请注意,BOM 也可能在包含的文件中。您是否进行过 BOM 搜索? stackoverflow.com/questions/204765/…
  • 谢谢波兹。这就是问题所在。我必须用记事本修改了一个包含的文件来更改密码,并且它向其中添加了 BOM。
  • 很高兴知道包含文件中的 BOM 也会影响主文件。案件解决了,今天学到了一些新东西。再次感谢。
猜你喜欢
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-03-09
  • 2012-10-20
  • 2013-07-26
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多