Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Download-Datei, chinesisches verstümmeltes Problem

PHP-Download-Datei, chinesisches verstümmeltes Problem

巴扎黑
巴扎黑Original
2016-11-22 16:44:431353Durchsuche

Durch die Einstellung von Content-Type auf application/octet-stream können dynamisch generierte Inhalte als Datei heruntergeladen werden. Ich glaube, das weiß jeder. Verwenden Sie dann Content-Disposition, um den Namen der heruntergeladenen Datei festzulegen. Viele Leute wissen das. Grundsätzlich ist das Download-Programm so geschrieben:

$filename = "document.txt";
header('Content-Type: application/octet-stream') ;
header('Content-Disposition: attachment; filename=' . $filename);
print "Hello!";
?>
[/cdoe]
Verwenden Sie den Browser wie folgt Nach dem Öffnen können Sie document.txt herunterladen.

Wenn $filename jedoch UTF-8-codiert ist, können einige Browser damit nicht richtig umgehen. Ändern Sie beispielsweise das obige Programm leicht:
[code]
$filename = "Chinese file name.txt";
header('Content-Type: application/octet- stream');
header('Content-Disposition: attachment; filename=' . $filename);
print "Hallo!";
?>
[/cdoe]
If Wird das Programm in UTF-8-Kodierung gespeichert und dann erneut aufgerufen, wird der vom IE6 heruntergeladene Dateiname verstümmelt. Der unter FF3 heruntergeladene Dateiname enthält nur das Wort „Chinesisch“. Unter Opera 9 funktioniert alles einwandfrei.

Der Ausgabeheader sieht tatsächlich so aus:

Content-Disposition: attachment filename=Chinese file name.txt Tatsächlich ist gemäß der Definition von RFC2231 die mehrsprachige Codierung Content- Die Disposition sollte wie folgt definiert werden:

Content-Disposition: attachment; filename*="utf8''Chinese file name.txt" Das heißt:

Fügen Sie vor dem Gleichheitszeichen nach dem Dateinamen * hinzu
Der Wert des Dateinamens wird verwendet. Die einfachen Anführungszeichen sind in drei Segmente unterteilt: Zeichensatz (utf8), Sprache (leer) und URL-codierter Dateiname.
Es ist am besten, doppelte Anführungszeichen hinzuzufügen, da sonst der Teil nach den Leerzeichen im Dateinamen nicht in Firefox angezeigt wird.
Beachten Sie, dass das Ergebnis von urlencode nicht mit dem Ergebnis der urlencode-Funktion von PHP übereinstimmt wird die Leerzeichen ersetzen durch, Dies muss ersetzt werden durch
Nach dem Testen wurde festgestellt, dass die Unterstützung mehrerer Mainstream-Browser wie folgt ist:

IE6 filename=""
FF3-Anhang; Dateiname="UTF-8-Dateiname"
Anhang; Dateiname*="utf8''"
O9-Anhang ; filename="UTF-8Dateiname"
Safari3(Win) scheint nicht unterstützt zu werden? Keine der oben genannten Methoden wird funktionieren

Es scheint, dass das Programm so geschrieben sein muss, um alle gängigen Browser zu unterstützen:
[code]
$ua = $_SERVER ["HTTP_USER_AGENT"];
$filename = "Chinesischer Dateiname.txt";
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace(" ", " ", $encoded_filename);
header('Content-Type: application/octet-stream');
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename= "' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8'' ' . $ filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
print ' ABC';
?>

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn