Wie ein Nicht-ASCII-Dateiname in der Datei-Download-Box in Browsern angezeigt werden?

StackOverflow https://stackoverflow.com/questions/149058

  •  02-07-2019
  •  | 
  •  

Frage

Es scheint keine Header-Parameter in nicht ASCII-Format eine akzeptierte Art und Weise des Sendens unten zu sein.

Der Header für Dateidownload sieht in der Regel wie

Content-disposition: attachment; filename = "theasciifilename.doc"

Außer wenn Sie ein UTF-8-codierte Zeichenfolge im Dateinamen zu zerschlagen, wird Firefox damit umgeht fein, während IE bis werfen.

Es ist ein Dokument auf Codeproject rel="nofollow, das ein Verfahren zur Codierung der Dateinamen erklärt.

Dieses Dokument kodiert Bản KIEM Kê.doc bis B% e1% BA% A3N% 20Ki% e1% bb% 83m% 20K% c3% aa.doc hex durch Codieren des Bytes.

Problem # 1: Das erste Zeichen in dieser Zeichenkette: a einen Wert von A hat - die Zahl ist in Hex kodieren und Sie erhalten% a3% 1e. Wie hat dieser Typ% e1% ba% a3 erhalten? (Ich bin fehlt offensichtlich etwas einfach hier)

Problem # 2: Während IE diese Codierung erkennt an, Firefox nicht! Was ist zu tun?

War es hilfreich?

Lösung

Antwort auf Frage 1: Sie sind verwirrend Unicode und UTF-8. Der Hex-Wert von ‚a‘ ist 0xA31E jedoch, dass nicht ein UTF-8-Charakter. In UTF-8, das Zeichen requries drei Bytes, 0xE1 0xBA 0xA3. URL-Codierung wird schlecht definiert für Nicht-ASCII-Codierungen aber% e1% BA% a3 ist die gültige UTF-8-Kodierung für das Zeichen zu verwenden.

Andere Tipps

Die Spezifikationen grundsätzlich nicht erlauben, etwas anderes als US-ASCII. HTTP-Header sind US-ASCII. Nutzlast des HTTP standardmäßig auf ISO 8859-1, aber das bezieht sich auf den Inhalt Körper, nicht die Header.

Die wohl das Richtige zu tun wäre, MIME sprühte für die Codierung von Nicht-ASCII-Daten in Header zu verwenden, wie in RFC 2047 , aber ich habe keine Ahnung, ob Browser, die tatsächlich unterstützen.

EDIT: Whoops, nein, RFC 2047 Abschnitt 5 ausdrücklich sagt, dass die codierte Form nicht in Content-Disposition erlaubt ist. Sieht aus wie du kein Glück -. Gibt es keinen Standard

EDIT 2: Es ist ein Standard - RFC 2231 definiert, wie dies jetzt arbeiten soll. Es hat Unterstützung von einigen Browsern, ist aber nicht in IE unterstützt. Ich fand denen rel="noreferrer"> zeigen, wie es funktioniert und welche Browser-Unterstützung ist zur Verfügung.

Für Problem # 2 müssen Sie kodieren die Dateinamen für Internet Explorer und Firefox URL. 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 dem Link haben Sie oben bekommen, e1 ba a3 ist die UTF-8-Codierung des Zeichens erwähnt, nicht der Zeichencode.

Antwort (Art) zu Problem # 2:

Da Sie, dass das Namensschema in einem Browser entdeckt haben, funktioniert nicht in der anderen, die einzige Lösung ist, es zu tun anders für jeden Browser, ähnlich dem Beispiel hier .

Falls der Link geht weg, die Lösung ist im Grunde:

1. If browser is IE URL encode filename
2. Generate Content-disposition header

Natürlich bestimmt wird, ob der Browser IE ist von User-Agent (die über die einzige Möglichkeit ist, können Sie es tun) ist voller alle Arten der üblichen Gefahr.

Wie nordamerikanische centric wie das klingt, wenn es wichtig ist, dass diese Arbeit in einer Vielzahl von Browsern Sie nicht kontrollieren, die die User-Agenten blockiert haben können, oder geändert wird, dann einfach UTF-8-codierte Zeichen in der Vermeidung von Dateinamen und verwenden Sie immer „Download“ oder so etwas.

Leider gibt es derzeit keine einzige Art und Weise, die in allen User Agents funktionieren würde.

Siehe http://greenbytes.de/tech/tc2231/ für Testfälle, dann beschweren sich bei Microsoft, Google und Apple.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top