5

J'ai une requête JavaScript allant à un gestionnaire HTTP ASP.Net (2.0) qui transmet la requête à un service web java. Dans ce système, les caractères spéciaux, comme ceux qui ont un accent, ne sont pas transmis correctement.Problème de codage d'un fichier avec un gestionnaire http .Net

E.G.

  • entrée humaine: Düsseldorf
  • devient une demande asynch JavaScript à http://site/serviceproxy.ashx?q=D%FCsseldorf, qui est valable dans la norme ISO-8859-1, ainsi que dans UTF-8 pour autant que je peux dire. (sauf si c'est% c3% bc en UTF-8)
  • HttpContext.Current.Request.QueryString.Get("q") renvoie D�sseldorf où les problèmes commencent.
  • mais HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.GetEncoding("ISO-8859-1")) retours D%3fsseldorf (un « ? »)
  • et HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8) retours D%ef%bfsseldorf

Il la valeur ne soit pas décodé ni recodé correctement à être transmis au service java.

  • Avis HttpContext.Current.Request.Url.Query est ?q=D%FCsseldorf&output=json&from=1&to=10
  • tandis que HttpContext.Current.Request.QueryString.ToString() est q=D%ufffdsseldorf&output=json&from=1&to=10

Pourquoi est-ce, et comment puis-je dire au HttpContext d'honorer les en-têtes de demande qui comprennent:

Content-Type=application/x-www-form-urlencoded;+charset=UTF-8 

et décoder le QueryString de l'URL en utilisant le jeu de caractères UTF-8. Addendum: Comme le note la réponse, le problème ne réside pas tant dans le décodage que dans le codage; en utilisant escape() en JavaScript n'échappe pas selon UTF-8, tout en utilisant encodeURIComponent() fait.

Répondre

6

Je ne sais pas quel est le codage de caractères par défaut utilisé par votre serveur (IIS?), Ou s'il peut être changé, mais je peux vous dire quelques choses qui pourraient aider.

0xFC est le codage ISO-8859-1 pour ü. Alors que le point de code Unicode est U + 00FC, lorsqu'il est codé avec UTF-8, cela nécessite deux octets et devient 0xC3 0xBC. Si un décodeur UTF-8 voyait la séquence d'octets illégaux 0xFC, il la décoderait comme un "caractère de remplacement" Unicode, U + FFFD, et ramasserait là où il voyait le début d'une autre séquence d'octets valide, dans un décodeur UTF-8. ce cas est '.

La raison pour laquelle vous obtenez %3f est que '?' est le "caractère de remplacement" pour le jeu de caractères latins, similaire à & # 65533; dans le jeu de caractères Unicode.

Je crois que ce que vous voyez est le codage client avec ISO-8859-1, mais le serveur décode avec UTF-8. Dès qu'il touche le serveur, vos données sont corrompues. Je vous recommande de modifier le client pour utiliser l'encodage UTF-8; il devrait demander http://site/serviceproxy.ashx?q=D%C3%BCsseldorf

On dirait que vous construisez ces URL à partir de JavaScript, donc vous devez utiliser les fonctions encodeURI et encodeURIComponent, non escape.

+0

Et là je cherchais un moyen de dire escape() je voulais utiliser UTF-8. Je n'ai pas pensé à regarder encodeURIComponent(). Aussi, j'ai mal compris UTF-8 et pensé% FC pourrait être valide pour les deux. – dlamblin

1

Je rencontre le même problème avec un gestionnaire générique ASP.NET lorsque l'URL est tapée directement dans IE8. Les personnages sont envoyés par en tant que char 65533, et pourtant je n'ai IE8 mis à

[x] Send UTF-8 URLs.

Dans mon scénario, je débogage un gestionnaire HTTP dans Visual Studio et en tapant l'adresse du gestionnaire directement dans le navigateur:

 http://localhost/myHandler.ashx?term=xxxxxx

puis de parcourir le code. Le client transmettra des URL codées en UTF-8, mais existe-t-il un moyen de déboguer le code lorsque IE8 exécuté sur la machine de développement est le client?

Questions connexes