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.

Travis
la source

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)

Steve
la source
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

David Thibault
la source
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

Ali Mamedov
la source
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.

Echilon
la source
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.

Billy Jo
la source
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"
Cœur
la source
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.

Vendeurs Mitchel
la source
1
L'objet Serveur est inaccessible depuis une application Windows
travis