2008-09-29 4 views
8

Es scheint keine akzeptierte Möglichkeit zu geben, einen Header-Parameter im non ASCII-Format zu senden.Wie wird ein nicht-ASCII-Dateiname in der Datei-Download-Box in Browsern angezeigt?

Der Header für Datei-Download in der Regel sieht aus wie

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

Außer wenn Sie eine utf8 kodierte Zeichenkette in den filename Parameter zerlegen, Firefox wird es gut behandeln, während IE wird kotzen.

Es gibt ein document on CodeProject that explains a method for encoding the filename.

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

Problem # 1: das erste Zeichen in dieser Zeichenfolge: ả hat einen Wert von ả - kodieren Sie diese Zahl in Hex und erhalten Sie% 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 ist zu tun?

Antwort

3

Antwort zu Frage 1: Sie verwechseln Unicode und UTF-8. Der Hexadezimalwert von 'ả' ist 0xA31E, aber das ist kein UTF-8-Zeichen. In UTF-8 erfordert 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.

+0

Es gibt kein "UTF-8-Zeichen". – immibis

1

In der Verknüpfung, die Sie oben haben, ist e1 ba a3 die UTF-8-Codierung des genannten Charakters, nicht der Zeichencode.

0

Antwort (Art) zu Problem # 2:

Da Sie, dass das Namensschema in einem Browser nicht in der anderen funktioniert entdeckt haben, ist Ihre einzige Lösung ist es für jeden Browser anders zu machen, ähnlich zum Beispiel here.

Falls der Link weggeht, ist die Lösung 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 möglichen Gefahren.

So nordamerikanisch centric wie dies klingt, wenn es wichtig ist, dass dies in einer großen Anzahl von Browsern funktioniert, die Sie nicht kontrollieren, die den User-Agent blockiert oder geändert haben, dann vermeiden Sie einfach UTF-8-codierte Zeichen in der Dateiname und immer "Download" oder so etwas verwenden.

8

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, nicht auf die Header.

Wahrscheinlich die richtige Sache zu tun wäre, MIME-Technik für die Codierung von Nicht-ASCII-Daten in Headern zu verwenden, wie in RFC 2047 beschrieben, aber ich habe keine Ahnung, ob Browser dies tatsächlich unterstützen.

EDIT: Whoops, nein, RFC 2047 Abschnitt 5 besagt ausdrücklich, dass das codierte Formular in Content-Disposition nicht zulässig ist. Sieht aus, als hättest du kein Glück - es gibt keinen Standard.

EDIT 2: Es gibt einen Standard - RFC 2231 definiert, wie dies jetzt funktionieren soll. Es hat Unterstützung von einigen Browsern, wird aber in IE nicht unterstützt. Ich habe some test cases gefunden, die zeigen, wie es funktioniert und welche Browserunterstützung verfügbar ist.

+0

IE8 (und höher) unterstützt RFC 2231, wie auch alle anderen modernen Browser. Die einzigen, die den angegebenen Dateinamen in diesem Format nicht erkennen und die immer noch etwas beliebt sind, sind IE6 und IE7. –

+0

IE8 unterstützt RFC 2231 nicht, gerade getestet. Siehe auch http://greenbytes.de/tech/tc2231/ –

2

Für Problem # 2 müssen Sie den Dateinamen für Internet Explorer und Firefox URL-encodieren. 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.

0

Leider gibt es derzeit keine einzige Möglichkeit, die in allen User Agents funktionieren würde.

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