5

Tengo una solicitud de JavaScript para un controlador HTTP ASP.Net (2.0) que pasa la solicitud a un servicio web de Java. En este sistema, los caracteres especiales, como los que tienen acento, no se transmiten correctamente.Problemas para codificar una diéresis con en .Net http handler

POR EJEMPLO

  • de entrada humana: Düsseldorf
  • se convierte en una solicitud asynch JavaScript para http://site/serviceproxy.ashx?q=D%FCsseldorf, que es válido en la norma ISO-8859-1, así como en UTF-8 por lo que yo puedo decir. (a menos que sea% c3% bc en UTF-8)
  • HttpContext.Current.Request.QueryString.Get("q") devuelve D�sseldorf que es donde comienzan los problemas.
  • HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.GetEncoding("ISO-8859-1")) pero vuelve D%3fsseldorf (A '?')
  • y HttpUtility.UrlEncode(HttpContext.Current.Request.QueryString.Get("q"), Encoding.UTF8) vuelve D%ef%bfsseldorf

Por lo tanto, el valor no quede decodificado ni re-codificado correctamente para ser transmitida al servicio de Java.

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

¿Por qué es esto y cómo puede decir que la HttpContext en honor a las cabeceras de petición que incluyen:

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

y decodificar el URL QueryString usando el juego de caracteres UTF-8.

Addendum: Como dice la respuesta, el problema no radica tanto en la decodificación como en la codificación; utilizando escape() en JavaScript no escapa de acuerdo con UTF-8, mientras que usa encodeURIComponent() hace.

Respuesta

6

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 pueden ser útiles.

0xFC es la codificación ISO-8859-1 para ü. Mientras que 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 fueron para ver la secuencia de bytes ilegal 0xFC, sería decodificar como un "carácter de sustitución" Unicode, U + FFFD, y continuar donde se vio el comienzo de otra secuencia de bytes válidos, en este caso es '.

La razón por la que obtienes %3f es que '?' es el "carácter de reemplazo" para el conjunto de caracteres latinos, similar a & # 65533; en el conjunto 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 llegue al servidor, sus datos estarán corruptos. Recomiendo que modifiques el cliente para usar la codificación UTF-8; cabe solicitando http://site/serviceproxy.ashx?q=D%C3%BCsseldorf

Suena como usted está construyendo estas URL desde JavaScript, por lo que debe utilizar las funciones encodeURI y encodeURIComponent, no escape.

+0

Y aquí estaba buscando una forma de decir escape() Quería usar UTF-8. No pensé en mirar encodeURIComponent(). También malentendí UTF-8 y pensé que% FC podría ser válido para ambos. – dlamblin

1

Tengo el mismo problema con un controlador genérico de ASP.NET cuando la URL se escribe directamente en IE8. Los caracteres están siendo enviados a través como char 65533, y sin embargo no tienen IE8 establece en

[x] Send UTF-8 URLs.

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

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

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

Cuestiones relacionadas