2009-06-24 6 views
0

Ok Ich habe ein Problem. Ich habe einen Linux-Webserver (RHEL 4 mit Apache 2), in dem eine Anwendung untergebracht ist. Teil dieser Anwendung ist eine Reihe von PHP-Skripten. Ich habe ein Skript erstellt, das einige Formularvariablen akzeptiert und dann eine Datei an den Benutzer herunterlädt. Hier si der Code:Fix Datei Endcodierung beim Herunterladen einer Datei von Linux nach Windows in PHP

Das alles funktioniert gut, und die Datei wird heruntergeladen. Aber es gibt ein Problem. Diese Dateien werden von der Linux-Box auf eine Windows-Maschine (ALWAYS) heruntergeladen. Das Problem ist die Kodierung. Wenn Sie die Datei auf der Linux-Box betrachten, wird der gesamte Text ausgerichtet und alle Spalten sehen gut aus. (Die Dateien sind nur flache Textdateien). Wenn die Datei jedoch in das Windows-Feld heruntergeladen und in Notepad geöffnet wird, ist die Datei vollständig verschmutzt und nichts ist ausgerichtet. Sie sehen auch seltsame Zeichen (die, die wie eine Box aussehen, aber das ist nur die generische Darstellung für den unbekannten Kennzeichner). Wenn diese Datei in ein anderes Programm importiert wird, funktioniert sie nicht.

Allerdings, wenn ich die Datei nach oben in WordPad öffnen, den ganzen Text korrekt aussehen. Wenn ich es von Wordpad speichere, wird es korrekt importiert und in Notepad korrekt angezeigt. wäre toll

Ich habe nicht viel know auf Dateicodierung, so dass alle Informationen darüber, wie ich an den Benutzer vor dem Senden zum Herunterladen der Datei kodieren kann.

Ich habe versucht, die readfile($fullPath); mit dem Ersetzen: Dank

$handle = @fopen($fullPath, "r"); 
if ($handle) { 
    while (!feof($handle)) { 
     $buffer = fgets($handle); 
     $buffer = str_replace('\n', '\r\n', $buffer); 
     echo $buffer; 
    } 
    fclose($handle); 
} 

!

+0

Für den Fall, jemand kommt hier mit ähnlichen Problemen: wenn Zeilenumbrüche in Kisten in Notepad/Editor drehen, aber gut aussehen in Wordpad, dann ist es eine Frage der nicht mit Windows Zeilenumbrüchen (aus irgendeinem Grund ist Notepad ziemlich anal über Zeilenumbrüche, während Wordpad es richtig macht). Wenn andere Zeichen aussehen, haben Sie wahrscheinlich ein Codierungsproblem (z. B. UTF-8, das als Windows-1252 oder US-ASCII behandelt wird). –

Antwort

2

Es gibt ein Problem mit der folgenden Zeile:

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

Sie bräuchten doppelte Anführungszeichen dort zu verwenden. "\ n" ist newline. ‚\ N‘ ist die wörtliche char Sequenz Backslash-n:

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

Es ist ein Unix-Dienstprogramm ‚unix2dos‘ und ‚dos2unix‘, die helfen könnten. Sie könnten es von PHP als Systemaufruf nennen.

Oder ich bin sicher, es gibt eine php-Version der gleichen Sache.

Aber ich bin kein PHP-Typ.

+0

Ich mag diese Idee, sein ist, dass es wahrscheinlich mehr tut, als nur die Newline auf das DOS-Format zu aktualisieren. Das Problem ist, wenn ich versuche und es von PHP ausführen, bekomme ich keine Antwort. Jeder hat irgendeine Hilfe. – alanquillin

+0

Ah, Sie müssten Dateien für Sie ändern lassen. sys ('unix2dos', $ fullPath, $ fullPath. "_ Dos") Und dann senden Sie die _dos-Datei. Und dann löschen Sie es nach. Nicht ideal. –

-1

EDIT: Das wusste ich nicht über PHP-Zitat. Dennoch müssen Sie sich möglicherweise für eine Standardcodierung entscheiden, wenn mehrere Sprachen verwendet werden. Der Rest dieses Beitrags ist weiterhin gültig.

Windows verwendet im Allgemeinen ANSI oder ASCII-codierte Dateien für Text, den Zeichensatz verwenden, die lokal auf dem System ist. (Wie cp1252).

Es könnte am einfachsten, es nur zu kodieren alle in UTF8, und dann Notizblock sagen die Datei in als UTF8 Dokument zu lesen. (Es ist ein Dropdown-Menü im Datei-> Öffnen-Dialog.)

Ich sehe keine Möglichkeit, die Codierung über die Befehlszeile anzugeben, und ich bin mir nicht sicher, dass Notepad es automatisch finden wird.

Verwandte Themen