2010-07-05 4 views
0

J'ai une chaîne de requête avec une valeur de paramètre qui contient le caractère norvégien å codé %e5. La page contient un formulaire avec un attribut d'action qui est automatiquement rempli par ASP.Net. Lorsque l'URL est sortie dans ledit attribut, elle est imprimée avec un codage complet à deux octets: %u00e5. Lors de la publication, cela semble être correct lors du débogage du code derrière. Toutefois, la page ne fait une redirection vers lui-même (pour une autre raison) et l'en-tête de l'emplacement redirect ressemble à ceci: Location: /myFolder/MyPage.aspx?Param1=%C3%A5Codage rompu après publication

Ainsi, le %e5 a été traduit %C3%A5 qui rompt la sortie en quelque sorte.

Dans le texte HTML, les caractères brisés ressemblent à Ã¥ après avoir été sortis via HttpUtility.HtmlEncode.

L'application Web entière est codée ISO8859-1.

PS. Lorsque vous supprimez le u00 de la sortie %u00e5 dans l'attribut d'action avant de poster le formulaire, tout est bien produit. Mais l'erreur semble être la traduction de %e5 à %C3%A5. (Et bien sûr l'auto-redirection, mais c'est une autre affaire.)

Des pointeurs?

+1

Ce n'est pas une erreur , '% C3% A5' est simplement la version UTF-8 encodée en URL de å. L'erreur est dans la conversion au format HTML: chaque séquence codée UTF-8 dans l'URL doit être reconvertie en un point de code Unicode, puis encodée en HTML. – Philipp

+0

En fait, il semble que l'encodage d'URL est correct quand il est '% e5' pour' å' selon http://www.w3schools.com/tags/ref_urlencode.asp. Il semble que le problème est que la redirection IIS sort l'en-tête 'location' avec un encodage utf-8, c'est-à-dire que'% e5' est traduit en '% c3% a5' – Polymorphix

Répondre

0

La solution à laquelle j'ai abouti consistait à coder manuellement l'URL de redirection.

public void ReloadPage() 
{ 
    UrlBuilder url = new UrlBuilder(Context, Request.Path); 
    foreach (string queryParam in Request.QueryString.AllKeys) 
    { 
     string queryParamValue = Request.QueryString[queryParam]; 
     url.AddQueryItem(queryParam, queryParamValue); 
    } 
    Response.Redirect(url.ToString(), true); 
} 

Le url.AddQueryItem fait essentiellement HttpContext.Server.UrlDecode (queryParamValue) et le url.ToString construit la chaîne de requête et pour chaque élément de requête ne HttpContext.Server.UrlEncode (queryParamValue).

Le UrlBuilder est une classe déjà dans notre bibliothèque, donc une fois que j'ai trouvé le problème et réalisé que C# /. Net n'a pas fourni des outils pour cela, coder le correctif a été rapide :)

Questions connexes