C # a-t-il un équivalent à encodeURIComponent () de JavaScript?


135

En JavaScript:

encodeURIComponent("©√") == "%C2%A9%E2%88%9A"

Existe-t-il un équivalent pour les applications C #? Pour échapper des caractères HTML, j'ai utilisé:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"&#" + ((int)m.Value[0]).ToString() + ";");

Mais je ne sais pas comment convertir la correspondance au format hexadécimal correct que JS utilise. Par exemple ce code:

txtOut.Text = Regex.Replace(txtIn.Text, @"[\u0080-\uFFFF]",
    m => @"%" + String.Format("{0:x}", ((int)m.Value[0])));

Renvoie " %a9%221a"pour "©√"au lieu de "%C2%A9%E2%88%9A". Il semble que je doive diviser la chaîne en octets ou quelque chose comme ça.

Edit: Ceci est pour une application Windows, les seuls éléments disponibles System.Websont: AspNetHostingPermission, AspNetHostingPermissionAttributeet AspNetHostingPermissionLevel.

Réponses:


217

Uri.EscapeDataStringou HttpUtility.UrlEncodeest la manière correcte d'échapper à une chaîne destinée à faire partie d'une URL.

Prenons par exemple la chaîne "Stack Overflow":

  • HttpUtility.UrlEncode("Stack Overflow") -> "Stack+Overflow"

  • Uri.EscapeUriString("Stack Overflow") -> "Stack%20Overflow"

  • Uri.EscapeDataString("Stack + Overflow")-> Encode également "+" to "%2b"---->Stack%20%2B%20%20Overflow

Seul le dernier est correct lorsqu'il est utilisé en tant que partie réelle de l'URL (par opposition à la valeur de l'un des paramètres de la chaîne de requête)


Le principal problème que j'avais était de ne pas avoir de référence à System.Web dans ma solution, mais je n'étais pas au courant d'EscapeUriString, merci!
travis

53
Contrairement à encodeURIComponent (), Uri.EscapeUriString () n'encode pas "+" en "% 2b". Utilisez plutôt Uri.EscapeDataString ().
jwaliszko

4
Utilisez WebUtility au lieu de HttpUtility pour éviter d'avoir à référencer System.Web. HttpUtility n'existe pas dans .NET Core.
Steven De Kock

2
@Steve Envisageriez-vous de mettre votre dernier paragraphe en gras? Cela semble être la chose la plus importante à savoir sur cette page, et elle a besoin de plus de visibilité.
Timo

Voir également cette réponse pour plus d'explications sur la différence entre Uri.EscapeUriString et Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Jason

20

HttpUtility.HtmlEncode / Décoder
HttpUtility.UrlEncode / Décoder

Vous pouvez ajouter une référence à l' System.Webassemblage si elle n'est pas disponible dans votre projet


J'aurais dû être plus précis: il s'agit d'une application Windows, les seuls éléments disponibles dans System.Web sont: AspNetHostingPermission, AspNetHostingPermissionAttribute et AspNetHostingPermissionLevel.
travis

5
Vous pouvez ajouter une référence à l'assemblage System.Web
David Thibault

2
HtmlEncoding est une chose entièrement différente. UrlEncode est une API non sensée qui ne devrait jamais être utilisée. Cela n'a pas de sens d'encoder une URL entière (à moins que vous ne souhaitiez réellement encoder sa valeur à utiliser comme paramètre - mais ce n'est pas ce que cela fait). Le point d'encodage / échappement est que vous indiquez qu'un caractère réservé doit être passé sans sa signification habituelle (par exemple, cela? Identifie la requête, ou & sépare les paramètres de la requête). Cela nécessite des connaissances qu'UrlEncode n'a pas et ne peut pas avoir.
Brandon Paddock

18

J'ai essayé de faire un analogue entièrement compatible de l'encodeURIComponent de javascript pour c # et après mes expériences de 4 heures, j'ai trouvé ceci

CODE C #:

string a = "!@#$%^&*()_+ some text here али мамедов баку";
a = System.Web.HttpUtility.UrlEncode(a);
a = a.Replace("+", "%20");

le résultat est: !% 40% 23% 24% 25% 5e% 26 * () _% 2b% 20some% 20text% 20here% 20% d0% b0% d0% bb% d0% b8% 20% d0% bc% d0% b0% d0% bc% d0% b5% d0% b4% d0% be% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Après l'avoir décodé avec decodeURLComponent () de Javascript;

vous obtiendrez ceci :! @ # $% ^ & * () _ + du texte ici али мамедов баку

Merci de votre attention


2
Fonctionne, mais vous pouvez simplement utiliser à la Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку")place.
mklement0

En fait, Uri.EscapeDataStringencode les caractères '(' et ')' alors que ce HttpUtility.UrlEncoden'est pas le cas.
Øystein Kolsrud

12

System.Uri.EscapeUriString () ne semblait rien faire, mais System.Uri.Escape Data String () a fonctionné pour moi.


10

Essayez Server.UrlEncode(), ou System.Web.HttpUtility.UrlEncode()pour les instances où vous n'avez pas accès à l' Serverobjet. Vous pouvez également utiliser System.Uri.EscapeUriString()pour éviter d'ajouter une référence à l' System.Webassemblage.


1
Uri.EscapeUriString () n'a rien fait pour moi, mais j'ai pu encoder correctement les chaînes en utilisant Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: En effet. La raison est que cela Uri.EscapeUriString()correspond à JavaScript encodeURI()- qui préserve les caractères réservés par URI. tels que /, &... tel quel (plus #), alors - que vous avez découvert, il est Uri.EscapeDataString()correspondant à son JavaScript encodeURIComponent().
mklement0

8

Pour une application Windows Store, vous n'aurez pas HttpUtility. Au lieu de cela, vous avez:

Pour un URI, avant le '?':

  • Système. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "example.com/Stack%20Overflow++?"

Pour un nom ou une valeur de requête URI, après le «?»:

  • Système. Uri.EscapeDataString ("Stack Overflow ++")
    • -> "Stack% 20Overflow% 2B% 2B"

Pour un nom ou une valeur de requête x-www-form-urlencoded , dans un contenu POST:

  • System.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "Pile + débordement% 2B% 2B"

6

Vous pouvez utiliser l'objet Server dans l'espace de noms System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode et Server.HtmlDecode.

Edit: l'affiche a ajouté qu'il s'agissait d'une application Windows et non d'une application Web comme on pourrait le croire. Les éléments répertoriés ci-dessus seraient disponibles à partir de la classe HttpUtility dans System.Web qui doit être ajoutée en tant que référence au projet.


1
L'objet Serveur est inaccessible depuis une application Windows
travis
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.