316 votes

Comment faire un UrlEncode sans utiliser System.Web ?

J'essaie d'écrire une application client Windows qui appelle un site Web pour obtenir des données. Pour réduire l'installation au minimum, j'essaie de n'utiliser que les éléments suivants dlls dans le profil client de .NET Framework . Le problème est que j'ai besoin d'UrlEncode certains paramètres, y a-t-il un moyen facile de le faire sans importer System.Web.dll qui ne fait pas partie du Pofile du client ?

0 votes

Pourriez-vous montrer comment vous effectuez l'appel vers le site web ? Peut-être qu'il y a quelque chose à faire ici.

0 votes

Par curiosité, comment appeler un site Web pour obtenir des données sans utiliser System.Web ?

0 votes

@Patrick, il utilise probablement WebRequest ou WebClient . C'est la raison pour laquelle j'ai posé des questions sur ce code particulier, car il y a des choses qui peuvent être faites pour encoder correctement les données url.

322voto

ToddBFisher Points 5011

System.Uri.EscapeUriString() peut poser des problèmes avec certains caractères. Pour moi, il s'agissait d'un chiffre ou du signe '#' dans la chaîne.

Si c'est un problème pour vous, essayez :

System.Uri.EscapeDataString() //Works excellent with individual values

Voici une question-réponse de SO qui explique la différence :

Quelle est la différence entre EscapeUriString et EscapeDataString ?

et recommande d'utiliser Uri.EscapeDataString() dans tous les domaines.

1 votes

Faux : blogs.msdn.com/b/yangxind/archive/2006/11/09/ Vous aurez des problèmes avec les signes plus car ils ne seront pas décodés.

7 votes

Cet article de blog est un peu vieux et je viens d'avoir "Uri Escaped" une url complète et tous les espaces sont devenus %20, donc je pense qu'ils l'ont corrigé. J'utilise .Net 4.5.

0 votes

EscapeDataString ne prend pas non plus en charge les chaînes très longues si vous préparez des données pour une opération POST. stackoverflow.com/questions/6695208/

258voto

Thymine Points 2198

En .Net 4.5+, utilisez WebUtility

Juste pour le formatage, je soumets ceci comme une réponse.

Je n'ai pas pu trouver de bons exemples les comparant ainsi :

string testString = "http://test# space 123/text?var=val&another=two";
Console.WriteLine("UrlEncode:         " + System.Web.HttpUtility.UrlEncode(testString));
Console.WriteLine("EscapeUriString:   " + Uri.EscapeUriString(testString));
Console.WriteLine("EscapeDataString:  " + Uri.EscapeDataString(testString));
Console.WriteLine("EscapeDataReplace: " + Uri.EscapeDataString(testString).Replace("%20", "+"));

Console.WriteLine("HtmlEncode:        " + System.Web.HttpUtility.HtmlEncode(testString));
Console.WriteLine("UrlPathEncode:     " + System.Web.HttpUtility.UrlPathEncode(testString));

//.Net 4.0+
Console.WriteLine("WebUtility.HtmlEncode: " + WebUtility.HtmlEncode(testString));
//.Net 4.5+
Console.WriteLine("WebUtility.UrlEncode:  " + WebUtility.UrlEncode(testString));

Sorties :

UrlEncode:             http%3a%2f%2ftest%23+space+123%2ftext%3fvar%3dval%26another%3dtwo
EscapeUriString:       http://test#%20space%20123/text?var=val&another=two
EscapeDataString:      http%3A%2F%2Ftest%23%20space%20123%2Ftext%3Fvar%3Dval%26another%3Dtwo
EscapeDataReplace:     http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

HtmlEncode:            http://test# space 123/text?var=val&another=two
UrlPathEncode:         http://test#%20space%20123/text?var=val&another=two

//.Net 4.0+
WebUtility.HtmlEncode: http://test# space 123/text?var=val&another=two
//.Net 4.5+
WebUtility.UrlEncode:  http%3A%2F%2Ftest%23+space+123%2Ftext%3Fvar%3Dval%26another%3Dtwo

En .Net 4.5+, utilisez WebUtility.UrlEncode

Cela semble reproduire HttpUtility.UrlEncode (pré-v4.0) pour les caractères les plus courants :
Uri.EscapeDataString(testString).Replace("%20", "+").Replace("'", "%27").Replace("~", "%7E")
Note : EscapeUriString conservera une chaîne uri valide, ce qui l'amènera à utiliser autant de caractères en clair que possible.

Voir cette réponse pour un tableau comparant les différents encodages :
https://stackoverflow.com/a/11236038/555798

Sauts de ligne Tous ceux qui sont énumérés ici (autres que HttpUtility.HtmlEncode ) convertira "\n\r" sur %0a%0d ou %0A%0D

N'hésitez pas à modifier cet article et à ajouter de nouveaux caractères à ma chaîne de test, ou laissez-les dans les commentaires et je le modifierai.

0 votes

Dans mon cas, j'ai dû utiliser EscapeDataString plutôt que EscapeUriString car nous encodions les retours de chariot et les sauts de ligne, qui nécessitaient l'échappement plus agressif effectué par la commande EscapeDataString

1 votes

Plus d'exemples, vous pouvez fournir vos propres cas de test si vous le souhaitez. Voici un exemple d'exécution de cette méthode et des autres méthodes d'encodage qui montre des différences dotnetfiddle.net/12IFw1

3 votes

WebUtility.UrlEncode() et WebUtility.UrlDecode() sont 4.5+. Elles n'existent pas en 4.0.

54voto

Matthew Manela Points 9610

Vous pouvez utiliser

Uri.EscapeUriString (voir http://msdn.microsoft.com/en-us/library/system.uri.escapeuristring.aspx )

0 votes

Y a-t-il une différence entre ceci et EscapeDataString ?

3 votes

Vous voulez utiliser EscapeUriString. EscapeUriString essaiera d'encoder l'url dans son intégralité (y compris la partie http://), tandis que EscapeUriString comprend les parties qui doivent être encodées.

1 votes

Je vois, donc dans ce cas, je voudrais probablement EscapeDataString car je peux vouloir passer une URL comme paramètre get. Dans ce cas, j'ajoute une URL.

22voto

Elmue Points 277

Les réponses ici sont très bonnes, mais encore insuffisantes pour moi.

J'ai écrit une petite boucle qui compare Uri.EscapeUriString avec Uri.EscapeDataString pour tous les caractères de 0 à 255.

NOTE : Les deux fonctions ont l'intelligence intégrée que les caractères au-dessus de 0x80 sont d'abord encodés en UTF-8 et ensuite en pourcentage.

Voici le résultat :

******* Different *******

'#' -> Uri "#" Data "%23"
'$' -> Uri "$" Data "%24"
'&' -> Uri "&" Data "%26"
'+' -> Uri "+" Data "%2B"
',' -> Uri "," Data "%2C"
'/' -> Uri "/" Data "%2F"
':' -> Uri ":" Data "%3A"
';' -> Uri ";" Data "%3B"
'=' -> Uri "=" Data "%3D"
'?' -> Uri "?" Data "%3F"
'@' -> Uri "@" Data "%40"

******* Not escaped *******

'!' -> Uri "!" Data "!"
''' -> Uri "'" Data "'"
'(' -> Uri "(" Data "("
')' -> Uri ")" Data ")"
'*' -> Uri "*" Data "*"
'-' -> Uri "-" Data "-"
'.' -> Uri "." Data "."
'_' -> Uri "_" Data "_"
'~' -> Uri "~" Data "~"

'0' -> Uri "0" Data "0"
.....
'9' -> Uri "9" Data "9"

'A' -> Uri "A" Data "A"
......
'Z' -> Uri "Z" Data "Z"

'a' -> Uri "a" Data "a"
.....
'z' -> Uri "z" Data "z"

******* UTF 8 *******

.....
'Ò' -> Uri "%C3%92" Data "%C3%92"
'Ó' -> Uri "%C3%93" Data "%C3%93"
'Ô' -> Uri "%C3%94" Data "%C3%94"
'Õ' -> Uri "%C3%95" Data "%C3%95"
'Ö' -> Uri "%C3%96" Data "%C3%96"
.....

EscapeUriString doit être utilisé pour encoder les URLs, tandis que EscapeDataString doit être utilisé pour coder, par exemple, le contenu d'un Cookie, car les données de Cookie ne doivent pas contenir les caractères réservés '=' y ';' .

0 votes

Une bonne analyse et une bonne ventilation, très utile. si quelqu'un a ou connaît des repères de performance (comparant les trois méthodes), ce serait également intéressant de les voir.

0 votes

C'est une bonne analyse et le résultat est que vous ne devriez pas utiliser Uri.EscapeUriString parce que l'échappement des URI complets est impossible à réaliser de manière cohérente. Voir cette réponse pour une explication détaillée.

16voto

Sprague Points 903

Il y a une version utilisable par le profil client, la classe System.Net.WebUtility, présente dans le profil client System.dll. Voici le lien MSDN :

WebUtility

0 votes

La page d'aide de cette classe indique spécifiquement "Fournit des méthodes pour coder et décoder les URL lors du traitement des requêtes Web", il se peut donc qu'ils n'aient pas bien nommé les méthodes.

0 votes

Bon point, dis, pourquoi ne pas voter pour un frère en haut ;) ce vote négatif me hante depuis 2 ans ! JK... mais honnêtement c'est probablement la raison pour laquelle j'ai posté le lien, c'est malheureux que je prenne un coup de réputation pour des erreurs dans les docs de Microsoft...

11 votes

Il semble que UrlEncode et UrlDecode n'aient été ajoutés à WebUtility que dans la version 4.5 de .Net.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X