Comment afficher un nom de fichier non ASCII dans la boîte de téléchargement du fichier dans les navigateurs?

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

  •  02-07-2019
  •  | 
  •  

Question

Il ne semble pas y avoir de moyen accepté d’envoyer un paramètre d’en-tête au format non ascii.

L'en-tête de téléchargement de fichier ressemble généralement à

Contenu-disposition: pièce jointe; filename = "theasciifilename.doc"

Sauf si vous écrasez une chaîne encodée en utf8 dans le paramètre filename, Firefox la gérera bien, alors que IE en jettera.

Un code explique une méthode pour coder le nom de fichier.

Ce document code B?n Ki?m Kê.doc en B% e1% ba% a3n% 20Ki% e1% bb% 83m% 20K% c3% aa.doc en codant les octets en hexadécimal.

Problème n ° 1: le premier caractère de cette chaîne: ? a la valeur - encodez ce nombre en Hex et vous obtenez% a3% 1e. Comment ce gars a-t-il obtenu% e1% ba% a3? (Il me manque évidemment quelque chose de simple ici)

Problème n ° 2: Bien qu'IE reconnaisse cet encodage, Firefox ne le fait pas! Que faire?

Était-ce utile?

La solution

Réponse à la question n ° 1: vous confondez les codes Unicode et UTF-8. La valeur hexadécimale de '& # 7843;' est 0xA31E mais ce n’est pas un caractère UTF-8. Dans UTF-8, ce caractère nécessite trois octets, 0xE1 0xBA 0xA3 . Le codage d'URL est mal défini pour les codages non-ASCII, mais% e1% ba% a3 est le codage UTF-8 valide à utiliser pour ce caractère.

Autres conseils

Les spécifications ne permettent fondamentalement rien d'autre que l'US-ASCII. Les en-têtes HTTP sont US-ASCII. La charge par défaut de HTTP est ISO 8859-1, mais elle fait référence au corps du contenu et non aux en-têtes.

La bonne chose à faire serait d'utiliser la technique de MIME pour coder des données non-ASCII dans les en-têtes, comme décrit dans RFC 2047 , mais je ne sais pas si les navigateurs le supportent réellement.

EDIT: Ouf, non, la section 5 de la RFC 2047 indique explicitement que la forme codée n'est pas autorisée dans Content-Disposition. On dirait que vous n'avez pas de chance - il n'y a pas de standard.

MODIFIER 2: il existe une norme - RFC 2231 définit comment cela est censé fonctionner maintenant. Il est supporté par certains navigateurs, mais n'est pas supporté par IE. J'ai trouvé des quelques cas de test qui démontrent son fonctionnement et la prise en charge du navigateur. disponible.

Pour le problème n ° 2, vous devez encoder le nom de fichier pour Internet Explorer et Firefox par une URL. La seule différence est que vous devez utiliser le format de la RFC 2231 dans Firefox. Ceci s'applique à Firefox 3 et à Internet Explorer 7.

Dans le lien que vous avez ci-dessus, e1 ba a3 est le codage UTF-8 du caractère mentionné, pas le code du caractère.

Réponse (en quelque sorte) au problème n ° 2:

Puisque vous avez découvert que le schéma de nommage dans un navigateur ne fonctionne pas dans l'autre, votre seule solution consiste à le faire différemment pour chaque navigateur, comme dans l'exemple ici .

Si le lien disparaît, la solution est fondamentalement:

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

Bien sûr, déterminer si le navigateur est IE par User-agent (ce qui est à peu près le seul moyen de le faire) est semé d'embûches pour toutes les sortes de périls habituels.

Aussi centré sur l'Amérique du Nord que cela puisse paraître, s'il est important que cela fonctionne dans un grand nombre de navigateurs que vous ne maîtrisez pas. User-agent peut être bloqué ou modifié, évitez simplement les caractères encodés en UTF-8 dans le répertoire. nom_fichier et utilisez toujours " Télécharger " ou quelque chose.

Malheureusement, il n'existe actuellement aucun moyen unique de fonctionner dans tous les agents d'utilisateur.

Voir http://greenbytes.de/tech/tc2231/ pour les scénarios de test, puis se plaindre à Microsoft, Google et Apple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top