好的,我有一个问题。我有一个Linux Web服务器(带有apache 2的RHEL 4),用于存放应用程序。这个应用程序的一部分是一组PHP脚本。我创建了一个接受一些表单变量的脚本,然后将文件下载到用户。这里是代码:
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.$destFileName);
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($fullPath));
ob_clean();
flush();
readfile($fullPath);
一切正常,文件下载。但有一个问题。这些文件正从Linux机器下载到Windows机器(ALWAYS)。问题是编码。当您查看Linux机器上的文件时,所有文本都是对齐的,并且所有列都很好。 (这些文件只是平面文本文件)。但是当文件被下载到Windows框中并在记事本中打开时,该文件全部被搞砸,并且没有任何对齐。你也看到了奇怪的特征(看起来像一个盒子,但这只是unknow字符的通用表示)。将此文件导入另一个程序时,它不起作用。
但是,当我在写字板中打开文件时,所有文本看起来都是正确的。如果我从wordpad保存它将正确导入,并在Notpad中看起来正确。
我对文件编码知之甚少,因此在发送给用户下载之前,如何对文件进行编码的任何信息都会很棒。
我确实尝试将readfile($fullPath);
替换为:
$handle = @fopen($fullPath, "r");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle);
$buffer = str_replace('\n', '\r\n', $buffer);
echo $buffer;
}
fclose($handle);
}
谢谢!
答案 0 :(得分:2)
以下行存在问题:
$buffer = str_replace('\n', '\r\n', $buffer);
你需要在那里使用双引号。 “\ n”是换行符。 '\ n'是字面字符序列反斜杠-n:
# php -r "var_dump('\n', \"\n\");"
string(2) "\n"
string(1) "
"
答案 1 :(得分:1)
有一个Unix实用程序'unix2dos'和'dos2unix'可能会有所帮助。你可以从php中调用它作为系统调用。
或者,我确定有同样的PHP版本。
但我不是个骗子。
答案 2 :(得分:-1)
Windows通常使用ANSI或ASCII编码的文件作为文本,使用系统本地的字符集。 (如cp1252)。
最简单的方法是将它全部用UTF8编码,然后告诉记事本将文件作为UTF8文件读取。 (这是File-> Open对话框中的下拉列表。)
我没有看到从命令行指定编码的方法,我不确定记事本会自动找到它。