Es scheint keine akzeptierte Möglichkeit zu geben, einen Header-Parameter im non ASCII-Format zu senden.
Der Header für den Datei-Download sieht normalerweise wie
ausInhaltsdisposition: Anhang; filename="derasciifilename.doc"
Außer wenn Sie eine utf8-codierte Zeichenfolge in den filename-Parameter zerlegen, wird Firefox damit gut umgehen, während IE sich übergeben wird.
Es gibt ein Dokument in CodeProject, das eine Methode zur Kodierung des Dateinamens erklärt.
Dieses Dokument codiert Bản Kiểm Kê.doc durch Hexadezimalkodierung der Bytes in B% e1% ba% a3n% 20Ki% e1% bb% 83m% 20K% c3% aa.doc.
Problem # 1: das erste Zeichen in dieser Zeichenkette: ả hat einen Wert von ả - kodiere diese Zahl in Hex und du bekommst% a3% 1e. Wie hat dieser Typ% e1% ba% a3 bekommen? (Ich vermisse hier offensichtlich etwas Einfaches)
Problem # 2: Während IE diese Kodierung erkennt, geht Firefox nicht! Was zu tun ist?
Antwort auf Frage 1: Sie verwechseln Unicode und UTF-8. Der Hexadezimalwert von 'ả' ist 0xA31E, aber das ist kein UTF-8-Zeichen. In UTF-8 benötigt dieses Zeichen drei Bytes, 0xE1 0xBA 0xA3
. Die URL-Codierung ist für Nicht-ASCII-Codierungen schlecht definiert, aber% e1% ba% a3 ist die gültige UTF-8-Codierung, die für dieses Zeichen verwendet wird.
Die Spezifikationen erlauben grundsätzlich nichts anderes als US-ASCII. HTTP-Header sind US-ASCII. Die Nutzdaten von HTTP lauten standardmäßig auf ISO 8859-1, beziehen sich jedoch auf den Inhaltshauptteil und nicht auf die Header.
Wahrscheinlich ist es das Richtige, die MIME-Technik für die Codierung von Nicht-ASCII-Daten in Headern zu verwenden, wie in RFC 2047 , aber ich habe keine Ahnung, ob Browser das tatsächlich unterstützen.
BEARBEITEN: Whoops, nein, RFC 2047, Abschnitt 5, sagt ausdrücklich, dass das kodierte Formular in Content-Disposition nicht erlaubt ist. Sieht so aus, als hättest du kein Glück - es gibt keinen Standard.
EDIT 2: Es gibt einen Standard - RFC 2231 definiert, wie das jetzt funktionieren soll. Es hat Unterstützung von einigen Browsern, wird aber in IE nicht unterstützt. Ich fand einige Testfälle , die zeigen, wie es funktioniert und welche Browserunterstützung verfügbar ist.
>Für Problem Nr. 2 müssen Sie den Dateinamen für Internet Explorer und Firefox URL-codieren. Der einzige Unterschied ist, dass Sie das Format von RFC 2231 in Firefox verwenden müssen. Dies gilt für Firefox 3 und Internet Explorer 7.
In der obigen Verknüpfung ist e1 ba a3 die UTF-8-Codierung des genannten Zeichens, nicht der Zeichencode.
Beantworte (Art) zu Problem # 2:
Da Sie festgestellt haben, dass das Benennungsschema in einem Browser in dem anderen Browser nicht funktioniert, ist Ihre einzige Lösung, es für jeden Browser anders zu machen, ähnlich dem Beispiel hier .
Falls die Verbindung verschwindet, ist die Lösung im Grunde:
%Vor%Natürlich ist es mit allen möglichen Gefahren behaftet, festzustellen, ob der Browser von User-Agent IE ist (was ungefähr der einzige Weg ist, wie Sie es tun können).
Wie nordamerikanisches centric das klingt, wenn es wichtig ist, dass dies in einer großen Anzahl von Browsern funktioniert, die Sie nicht kontrollieren können, die den User-Agent blockiert oder modifiziert haben, dann vermeiden Sie einfach UTF-8-codierte Zeichen im Dateiname und immer "Download" oder etwas.
Leider gibt es derzeit keinen Weg, der in allen Benutzeragenten funktionieren würde.
Siehe Ссылка für Testfälle, dann beschweren Sie sich bei Microsoft, Google und Apple.