2009-06-24 9 views
0

私は問題があります。私は、アプリケーションを格納するために使用されるLinuxのWebサーバー(Apache 2のRHEL 4)を持っています。このアプリケーションの一部は、一連のPHPスクリプトです。私はいくつかのフォーム変数を受け入れて、ファイルをユーザーにダウンロードするスクリプトを作成しました。ここにコード:LinuxからWindowsへファイルをダウンロードする際にファイルの終わりを修正しました。

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マシン(常に)にダウンロードされています。問題はエンコーディングです。 Linuxのボックスでファイルを見ると、すべてのテキストが整列され、すべての列が正常に表示されます。 (ファイルは単なるテキストファイルです)。しかし、ファイルがWindowsのボックスにダウンロードされ、メモ帳で開かれると、ファイルはすべて壊れてしまい、何も整列しません。また、奇妙な文字(ボックスのように見えますが、それは未知の文字の一般的な表現です)が見えます。このファイルを別のプログラムにインポートすると、動作しません。

ただし、ワードパッドでファイルを開くと、すべてのテキストが正しく表示されます。ワードパッドから保存すると正しく読み込まれ、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

念のために誰もが同様の問題でここに来る:改行は、それがないの問題だ、メモ帳/エディタでのボックスに変わりはなく、ワードパッドで罰金見ればWindowsの改行を使用している(何らかの理由でメモ帳は改行についてかなり肛門であるが、ワードパッドはそれを正しく取得する)。見た目が他の文字の場合は、おそらくエンコードの問題(Windows-1252またはUS-ASCIIとして扱われるUTF-8など)を処理している可能性があります。 –

答えて

2

は、次の行に問題があります。 "\ n"は改行です。 「\ n」はリテラル文字列のバックスラッシュ-nは次のとおりです。

# php -r "var_dump('\n', \"\n\");" 
string(2) "\n" 
string(1) " 
" 
1

「unix2dos」と「dos2unix」という有益なユーティリティがあります。あなたはシステムコールとしてPHPから呼び出すことができます。

また、同じもののPHP版があると確信しています。

しかし、私はPHPの男ではありません。

+0

私はこの考えが好きです。改行をDOSフォーマットに更新するだけではありません。問題は、私がPHPから試して実行するとき、私は応答を得ないということです。いずれにも助けがあります。 – alanquillin

+0

ああ、あなたのためにファイルを変更する必要があります。 sys( 'unix2dos'、$ fullPath、$ fullPath。 "_ dos") 次に、_dosファイルを送信します。 その後、それを削除します。 理想的ではありません。 –

-1

編集:PHPの引用についてはわかりませんでした。それでも、複数の言語を使用する場合は標準のエンコーディングを決定する必要がありますが、この記事の残りの部分は有効です。

Windowsは、通常、システムにローカルな文字セットを使用して、テキストにANSIまたはASCIIエンコードファイルを使用します。 (cp1252のように)。

すべてをUTF8でエンコードするのが最も簡単な場合があります。次に、メモ帳にUTF8ドキュメントとしてファイルを読み込むように指示します。 (ファイル→開くダイアログのドロップダウンです)

コマンドラインからエンコードを指定する方法はありません。メモ帳で自動的に検索されるかどうかはわかりません。あなたがそこに二重引用符を使用する必要があるだろう

$buffer = str_replace('\n', '\r\n', $buffer); 

関連する問題