我在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个字符。我已经检查了服务器上的文件并将其保存在那里(没有保存物料清单,并且有三个丢失的字符)。
创建和上传文件的PHP脚本具有标题
header('Content-Type:text/html; charset=UTF-8');
我已经在文件末尾添加了3次“换行”以获取三个丢失的字符。我也可以在变量$ fsize中添加+3,但是我觉得做这种作弊感觉不舒服(它可能会回击)。我认为应该有更优雅的方式。
奇怪的是我在使用IIS 7.5的Win7机器上使用相同的代码,并且没有添加UTF-8 BOM的问题。 PHP目录是Win7机器上目录的副本,包括php.ini文件。
有人可以看到我错过了什么吗?
提前感谢您的帮助。
答案 0 :(得分:0)
您也应该检查脚本文件中的BOM。通常,如果您的IDE使用BOM保存带有BOM的UTF-8文件,则它位于打开的<?php
标记之前,因此php将其视为输出。