2010-01-21 18 views
0

Je développe un gestionnaire HTTP générique dans VS2005 et je le teste en mode débogage. Cela fonctionne bien sauf lorsque la chaîne de requête contient des caractères de plus haut-bit, par ex. Petite lettre latine épine/u00FE þ et la lettre minuscule latine Ae/u00E6 æ.VS2005 Gestionnaire HTTP générique UTF-8: problèmes avec certains caractères de la chaîne de requête (par exemple þ æ)

IE8 sur mon ordinateur est configuré pour envoyer des URL UTF-8. Je suis en tapant ce qui suit dans la barre d'adresse IE8 lors du débogage du code:

 
    http://app/myHandler.ashx?term=foo // everything works 
    http://app/myHandler.ashx?term=þorn // does not work -- query from database fails 

La base de données est SQLite et il utilise le codage UTF-8 et il fonctionne très bien. Les requêtes qui utilisent ces caractères spéciaux fonctionnent correctement lorsqu'elles sont émises directement sur SQLite à l'aide d'autres outils graphiques ou à l'aide des compléments d'interface graphique System.Data.SQLite à Visual Studio. Est-ce que je décode les valeurs de la chaîne de requête correctement?

Est-ce que GetString() ne décode pas les octets?

 
    public StandardRequest(HttpContext context) 
    { 
     UTF8Encoding utf8 = new UTF8Encoding(); 

     if (context.Request.QueryString["term"] != null) 
     {    
      byte[] w = utf8.GetBytes(context.Request.QueryString["term"]); 
      word = utf8.GetString(w); 
      ... 

Dans le gestionnaire HTTP, ContentEncoding est réglé sur UTF-8:

  context.Response.ContentEncoding = System.Text.Encoding.UTF8;

et dans la fenêtre du local du débogueur, Request.ContentEncoding est également UTF-8.

Mais quand j'examine la valeur de chaîne de requête dans la fenêtre habitants, le terme valeur de la chaîne de requête « THORN » est affiché comme « [] ORN » et c'est la façon dont il est affiché dans l'instruction sql que j'envoie à la base de données. C'est comme si le personnage n'avait pas été reconnu. Est-ce que je fais quelque chose de mal dans la façon dont la valeur est saisie à partir de la chaîne de requête et convertie en chaîne de caractères?

Répondre

0

Que contient context.Request.QueryString["term"] en nombre entier, avant le décodage? Peut-être qu'il a déjà la valeur que vous voulez. Si les octets actuels ne sont pas en UTF8, utf8.GetBytes n'aidera pas.

0

Merci pour le conseil, eed3si9n. Cela m'a conduit à la solution.

J'étais sous l'impression (erronée) que IE convertirait les caractères tapés à la main dans la barre d'adresse dans le codage spécifié dans les paramètres. Ce n'est pas le cas. L'URL tapée ici doit déjà être codée.