web-dev-qa-db-fra.com

Est-ce que C # a un équivalent à la fonction encodeURIComponent () de JavaScript?

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 utilisé par JS. Par exemple ce code:

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

Résultats "%a9%221a" pour "©√" au lieu de "%C2%A9%E2%88%9A". Il semble que j'ai besoin de diviser la chaîne en octets ou quelque chose d'autre.

Modifier: il s’agit d’une application Windows, les seuls éléments disponibles dans System.Web sont: AspNetHostingPermission, AspNetHostingPermissionAttribute et AspNetHostingPermissionLevel.

122
travis

Uri.EscapeDataString Ou HttpUtility.UrlEncode Est le moyen approprié d'échapper à une chaîne censé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)

195
Steve

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

Vous pouvez ajouter une référence à la System.Web Assembly si ce n'est pas disponible dans votre projet

19
David Thibault

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

c # CODE:

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

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

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

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

Merci de votre attention

16
Ali Mamedov

System.Uri.EscapeUriString () n'a apparemment rien fait, mais System.Uri.Escape Data String () a fonctionné pour moi.

11
Echilon

Essayez Server.UrlEncode() ou System.Web.HttpUtility.UrlEncode() pour les cas où vous n'avez pas accès à l'objet Server. Vous pouvez également utiliser System.Uri.EscapeUriString() pour éviter d'ajouter une référence à la commande System.Web Assemblée.

9
Billy Jo

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

Pour un URI, avant le '?':

  • Système. Uri.EscapeUriString ("example.com/Stack Overflow ++?")
    • -> "exemple.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 --- ou nom de requête x-www-form-urlencoded , dans un POST content):

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

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

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

Edit: poster 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 de System.Web, qui doit être ajoutée en tant que référence au projet.

6
Mitchel Sellers