2010-03-25 6 views
4

Server.UrlEncode ("My File.doc") renvoie "My + File.doc", tandis que l'échappement javascript ("My File.doc") renvoie " Mon% 20Fichier.doc ". D'après ce que je comprends, le javascript est l'URL corectly codant la chaîne alors que la méthode .net n'est pas. Il semble certainement fonctionner de cette façon dans la pratique mettre http://somesite/My+File.doc ne cherchera pas "Mon fichier.doc" dans tous les cas je pourrais tester en utilisant firefox/i.e. et IIS, alors que http://somesite/My%20File.doc fonctionne bien. Ai-je manqué quelque chose ou est-ce que Server.UrlEncode ne fonctionne tout simplement pas correctement?Server.UrlEncode (chaîne s) ... n'est pas

+0

Utilisez URLPathEncode à la place de bit avant le? Querystring voir http://stackoverflow.com/questions/4145823/httpserverutility-urlpathencode-vs-httpserverutility-urlencode?lq=1 –

+0

Haha, c'est probablement la meilleure réponse donnée, malheureusement près de 2 ans après il est réellement utile. Oh bien au moins je le saurai pour référence future. –

+0

:) En fait, il semble que Uri.EscapeDataString est celui à utiliser car URLPathEncode n'échappe pas les caractères tels que les signes de pourcentage http://stackoverflow.com/questions/9400445/how-do-y-correctly-escape-a-document -name-in-net –

Répondre

7

Utilisez les scripts Javascripts encodeURIComponent()/decodeURIComponent() pour l'encodage "aller-retour" avec le code URLEncode/URL de .Net.

EDIT

Pour autant que je sache, historiquement le "+" a été utilisé dans le codage URL comme une substitution spéciale pour l'espace char (ASCII 20). Si une implémentation ne prend pas en compte l'espace en tant que caractère spécial avec la substitution '+', alors elle doit encore y échapper en utilisant son code ASCII (d'où '% 20').

Il y a une très bonne discussion de la situation à http://bytes.com/topic/php/answers/5624-urlencode-vs-rawurlencode. D'ailleurs, ce n'est pas concluant. La RFC 2396 rassemble l'espace avec d'autres personnages sans une représentation non réservée, ce qui fait partie de la foule '% 20'.

RFC 1630 côtés avec le '+' foule (via forum discussion) ...

Au sein de la chaîne de requête, le signe plus est réservée comme abbréviation de un espace. Par conséquent, les vrais signes plus doivent être codés. Cette méthode a été utilisée pour faciliter le passage des URI de requête dans les systèmes qui n'autorisaient pas les espaces.

En outre, les RFCs principaux sont ...

RFC 1630 - Universal Resource Identifiers dans WWW

RFC 1738 - Uniform Resource Locator (URL)

RFC 2396 - Uniform Resource Identifiers (URI) : Générique Syntaxe

3

Un + au lieu d'un espace est le codage correct de l'URL, tout comme l'échapperait à% 20. Voir l'article this (Programmation CGI en Perl - Encodage URL).

Le + n'est pas quelque chose que JavaScript peut analyser, donc javascript échappera l'espace ou + à %20.

4

Pour autant que je le comprends les javas cript est corectly URL codant la chaîne alors que la méthode .net n'est pas

En fait, ils sont tous les deux faux!

JavaScript escape() ne doit jamais être utilisé. En plus de ne pas encoder le caractère + en %2B, il code tous les caractères non ASCII en tant que séquence non standard %uNNNN.

Pendant ce temps Server.UrlEncode n'est pas exactement le codage d'URL en tant que tel, mais le codage à application/x-www-form-urlencoded, qui devrait normalement être utilisé pour les paramètres de requête. L'utilisation de + pour représenter un espace en dehors d'une construction name=value, comme dans une partie de chemin, est incorrecte.

Ceci est plutôt regrettable. Vous pouvez essayer de remplacer le caractère + par %20 après l'encodage avec UrlEncode() lorsque vous codez une partie de chemin plutôt qu'un paramètre. Dans un paramètre, + et %20 sont également bons.

2

Utilisation côté client et travaux côté client.

+0

Le seul problème est que System.Uri.EscapeDataString a une longueur de chaîne maximale de 0xfff0. –

Questions connexes