C # tem um equivalente ao encodeURIComponent () do JavaScript?


135

Em JavaScript:

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

Existe um equivalente para aplicativos C #? Para escapar caracteres HTML, usei:

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

Mas não tenho certeza de como converter a correspondência no formato hexadecimal correto que o JS usa. Por exemplo, este código:

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

Retorna " %a9%221a"para em "©√"vez de "%C2%A9%E2%88%9A". Parece que eu preciso dividir a string em bytes ou algo assim.

Edit: Isto é para um aplicativo do Windows, os únicos itens disponíveis em System.Websão: AspNetHostingPermission, AspNetHostingPermissionAttribute, e AspNetHostingPermissionLevel.

Respostas:


217

Uri.EscapeDataStringou HttpUtility.UrlEncodeé a maneira correta de escapar de uma string destinada a fazer parte de um URL.

Tome por exemplo a string "Stack Overflow":

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

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

  • Uri.EscapeDataString("Stack + Overflow")-> Também codifica "+" to "%2b"---->Stack%20%2B%20%20Overflow

Somente o último está correto quando usado como uma parte real do URL (em oposição ao valor de um dos parâmetros da cadeia de consulta)


O principal problema que eu estava enfrentando era não ter uma referência ao System.Web na minha solução, mas não sabia do EscapeUriString, obrigado!
travis 3/11

53
Ao contrário de encodeURIComponent (), Uri.EscapeUriString () não codifica "+" para "% 2b". Use Uri.EscapeDataString ().
precisa saber é o seguinte

4
Use WebUtility em vez de HttpUtility para evitar a referência ao System.Web. HttpUtility não existe no .NET Core.
Steven De Kock

2
@ Steve Você consideraria o último parágrafo em negrito? Parece ser a coisa mais importante a saber nesta página e precisa de mais visibilidade.
Timo

Consulte também esta resposta para obter mais explicações sobre a diferença entre o Uri.EscapeUriString e o Uri.EscapeDataString: stackoverflow.com/questions/4396598/…
Jason

20

HttpUtility.HtmlEncode/ Decodificar
HttpUtility.UrlEncode/ Decodificar

Você pode adicionar uma referência à System.Webmontagem se ela não estiver disponível no seu projeto


Eu deveria ter sido mais específico: isso é para um aplicativo do Windows, os únicos itens disponíveis no System.Web são: AspNetHostingPermission, AspNetHostingPermissionAttribute e AspNetHostingPermissionLevel.
travis

5
Você pode adicionar uma referência ao assembly System.Web
David Thibault

2
HtmlEncoding é uma coisa totalmente diferente. UrlEncode é uma API não sensorial que nunca deve ser usada. Não faz sentido codificar um URL inteiro (a menos que você queira codificar seu valor para usar como parâmetro - mas não é isso que isso faz). O ponto de codificação / escape é que você está transmitindo que um caractere reservado deve ser passado sem o seu significado usual (por exemplo, que? Identifica a consulta ou & separa os parâmetros da consulta). Isso requer conhecimento que o UrlEncode não possui e não pode ter.
Brandon Paddock

18

Eu tentei fazer analógico compatível completo do encodeURIComponent do javascript para c # e após minhas experiências de 4 horas, encontrei este

CÓDIGO c #:

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

o resultado é: !% 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% seja% d0% b2% 20% d0% b1% d0% b0% d0% ba% d1% 83

Depois de decodificá-lo com decodeURLComponent () do Javascript;

você obterá o seguinte :! @ # $% ^ & * () _ + algum texto aqui али мамедов баку

Obrigado pela atenção


2
Funciona, mas você pode simplesmente usar Uri.EscapeDataString("!@#$%^&*()_+ some text here али мамедов баку").
usar o seguinte código

Na verdade, Uri.EscapeDataStringcodifica os caracteres '(' e ')' enquanto HttpUtility.UrlEncodenão.
Øystein Kolsrud 5/09/19

12

System.Uri.EscapeUriString () não pareceu fazer nada, mas System.Uri.Escape Data String () funcionou para mim.


10

Tente Server.UrlEncode(), ou System.Web.HttpUtility.UrlEncode()nos casos em que você não tem acesso ao Serverobjeto. Você também pode usar System.Uri.EscapeUriString()para evitar adicionar uma referência à System.Webmontagem.


1
Uri.EscapeUriString () não fez nada para mim, mas eu era capaz de adequadamente url-codificar as cordas usando Uri.EscapeDataString ()
Toland Hon

3
@TolandHon: De fato. O motivo é que Uri.EscapeUriString()corresponde ao JavaScript encodeURI()- que preserva os caracteres reservados por URI. tais como /, &... como é (mais #), enquanto que - como você descobriu, é Uri.EscapeDataString()que corresponde ao JavaScript do encodeURIComponent().
usar o seguinte código

8

Para um aplicativo da Windows Store, você não terá o HttpUtility. Em vez disso, você tem:

Para um URI, antes do '?':

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

Para um nome ou valor de consulta URI, após o '?':

  • Sistema. Uri.EscapeDataString ("Estouro de pilha ++")
    • -> "Pilha% 20Estouro% 2B% 2B"

Para um nome ou valor de consulta x-www-form-urlencoded , em um conteúdo POST:

  • System.Net. WebUtility.UrlEncode ("Stack Overflow ++")
    • -> "Pilha + Estouro% 2B% 2B"

6

Você pode usar o objeto Server no espaço para nome System.Web

Server.UrlEncode, Server.UrlDecode, Server.HtmlEncode e Server.HtmlDecode.

Edit: poster acrescentou que este era um aplicativo do Windows e não um da web como se poderia acreditar. Os itens listados acima estariam disponíveis na classe HttpUtility dentro do System.Web, que deve ser adicionada como uma referência ao projeto.


1
O objeto de servidor é inacessível a partir de um aplicativo do Windows
travis
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.