Pregunta

Tengo una solicitud de JavaScript que va a un controlador HTTP ASP.Net (2.0) que pasa la solicitud a un servicio web java. En este sistema, los caracteres especiales, como los que tienen acento, no se transmiten correctamente.

E.G.

  • Entrada humana: Düsseldorf
  • se convierte en una solicitud de asíncrono de JavaScript para http: //site/serviceproxy.ashx? q = D% FCsseldorf , que es válido en ISO-8859-1 y en UTF-8 hasta ahora como puedo decir (a menos que sea% c3% bc en UTF-8)
  • HttpContext.Current.Request.QueryString.Get (" q ") devuelve D & # 65533; sseldorf que es donde comienzan los problemas.
  • but HttpUtility.UrlEncode (HttpContext.Current.Request.QueryString.Get (" q "), Encoding.GetEncoding (" ISO-8859-1 ")) devuelve D % 3fsseldorf (un '?')
  • y HttpUtility.UrlEncode (HttpContext.Current.Request.QueryString.Get (" q "), Encoding.UTF8) devuelve D% ef% bfsseldorf

Por lo tanto, el valor no se decodifica ni se vuelve a codificar correctamente para pasarlo al servicio de Java.

  • Aviso HttpContext.Current.Request.Url.Query es ?q=D%FCsseldorf&output=json&from=1&to=10
  • while HttpContext.Current.Request.QueryString.ToString () es q = D% ufffdsseldorf & amp; output = json & amp; from = 1 & amp; to = 10

¿Por qué es esto y cómo puedo decirle al HttpContext que respete los encabezados de solicitud que incluyen:

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

y decodifique el QueryString de la URL utilizando el juego de caracteres UTF-8.

Anexo: Como señala la respuesta, el problema no radica tanto en la decodificación como en la codificación; el uso de escape () en JavaScript no se escapa de acuerdo con UTF-8, mientras que el uso de encodeURIComponent () sí lo hace.

¿Fue útil?

Solución

No sé cuál es la codificación de caracteres predeterminada utilizada por su servidor (IIS?), o si se puede cambiar, pero puedo decirle algunas cosas que podrían ayudar.

0xFC es la codificación ISO-8859-1 para ü. Si bien el punto de código Unicode es U + 00FC, cuando se codifica con UTF-8, esto requiere dos bytes y se convierte en 0xC3 0xBC.

Si un decodificador UTF-8 viera la secuencia de bytes ilegal 0xFC, la decodificaría como un carácter de reemplazo Unicode, U + FFFD, y retomaría donde vio el comienzo de otra secuencia de bytes válida, en este caso 's'.

La razón por la que obtienes % 3f es esa '?' es el " carácter de reemplazo " para el conjunto de caracteres latinos, similar a & # 65533; en el juego de caracteres Unicode.

Creo que lo que está viendo es la codificación del cliente con ISO-8859-1, pero el servidor está decodificando con UTF-8. Tan pronto como llega al servidor, sus datos están dañados. Le recomiendo que modifique el cliente para usar la codificación UTF-8; debería solicitar http: //site/serviceproxy.ashx? q = D% C3% BCsseldorf

Parece que está construyendo estas URL a partir de JavaScript, por lo que debe usar las funciones encodeURI y encodeURIComponent , no escape .

Otros consejos

Tengo el mismo problema con un controlador genérico ASP.NET cuando la URL se escribe directamente en IE8. Los caracteres se envían como char 65533 y, sin embargo, tengo IE8 configurado en

[x] Send UTF-8 URLs.

En mi caso, estoy depurando un controlador HTTP en Visual Studio y escribiendo la dirección del controlador directamente en el navegador:

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

y luego recorriendo el código. El cliente pasará las URL codificadas UTF-8, pero ¿hay alguna forma de depurar el código cuando IE8 se ejecuta en la máquina de desarrollo es el cliente?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top