2010-12-04 3 views

Répondre

2

Je viens résolu ce problème en codant la chaîne d'origine à octets ASCII d'abord, puis coder revenir à UTF8 .

String Result = Uri.EscapeUriString(Encoding.UTF8.GetString(Encoding.ASCII.GetBytes("Percepção"))); 

Merci à binarycoder pour plus de détails.

+0

Sachez que 'Uri.EscapeUriString()' n'échappe pas '&' ni '=' ni '?', Ni aucun caractère réservé RFC. Cela signifie que vous cassez votre URL si vos paramètres de requête contenaient l'un de ces caractères. Il semble donc que Uri.EscapeDataString() 'soit la méthode à utiliser. –

7

La chaîne est d'abord codée en UTF-8, puis les octets sont transformés en caractères littéraux ou séquences codées en pourcentage.

Ceci peut être vu en comparant le résultat de EscapeUriString à:

Console.WriteLine(BitConverter.ToString(Encoding.UTF8.GetBytes("Percepção"))); 
// 50-65-72-63-65-70-C3-A7-C3-A3-6F 

La norme est RFC3986, qui stipule:

Lorsqu'un nouveau schéma d'URI définit un composant qui représente des données textuelles comprenant des caractères du jeu de caractères universel [UCS], les données doivent d'abord être codées en octets selon le codage de caractères UTF-8 [STD63]; alors, seuls les octets qui ne correspondent pas aux caractères de l'ensemble non réservé doivent être codés en pourcentage.

(En aparté, notez que Uri.EscapeDataString est souvent plus approprié à utiliser que Uri.EscapeUriString.)

+0

Merci pour cette réponse. J'ai résolu ce problème, voir ma réponse à cette question. – Codecat

+1

Etes-vous sûr d'utiliser Uri.EscapeDataString? Cela suggère que vous ne devriez pas: http://blogs.msdn.com/b/yangxind/archive/2006/11/09/don-t-use-net-system-uri-unescapedatastring-in-url-decoding. aspx –

+0

@GordonThompson Cet article dit ne pas utiliser '* Unescape * DataString()', pas 'EscapeDataString()'. En fait, vers la fin de l'article, ils recommandent d'utiliser 'EscapeDataString()' au lieu de 'HttpUtility.UrlEncode()'. –

-1
if (filterContext.RequestContext.HttpContext.Request.QueryString["params"] != null) { 
    param = HttpUtility.ParseQueryString(filterContext.RequestContext.HttpContext.Request.QueryString["params"].ToString()).ToString();      
} 

BONNE SOLUTION !!

+4

Pourriez-vous clarifier votre réponse ici s'il vous plaît? – tnw

+0

Je ne sais pas comment cela est pertinent par rapport à ma question initiale. – Codecat

0

La dernière façon de le faire fonctionner. Utilisez cette fonction

Function UriEncode(ByVal cText As String) As String 
     Dim cRes As String = "" 
     For Each iBy As Byte In Encoding.GetEncoding(1252).GetBytes(cText) 
     Select Case iBy 
      Case Asc("%") 
       cRes &= "%25" 
      Case Asc(" ") 
       cRes &= "+" 
      Case Is > 127 
       cRes &= "%" & Hex(iBy) 
      Case Else 
       cRes &= Convert.ToChar(iBy) 
     End Select 
     Next 
     Return cRes 
    End Function 

Si vous lancez:

MsgBox(UriEncode("Percepção")) 

Vous obtiendrez

Percep%E7%E3o 
Questions connexes