在php中将文件从Linux下载到Windows时修复文件编码

时间:2009-06-24 19:28:52

标签: php linux text encoding character-encoding

好的,我有一个问题。我有一个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);
}

谢谢!

3 个答案:

答案 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)

编辑:我不知道PHP的引用。但是,当使用多种语言时,您可能需要决定标准编码,本文的其余部分仍然有效。

Windows通常使用ANSI或ASCII编码的文件作为文本,使用系统本地的字符集。 (如cp1252)。

最简单的方法是将它全部用UTF8编码,然后告诉记事本将文件作为UTF8文件读取。 (这是File-> Open对话框中的下拉列表。)

我没有看到从命令行指定编码的方法,我不确定记事本会自动找到它。