2008-12-01 10 views
6

Acabo de instalar Winamp Song Requester que es un complemento de solicitud de canción web Winamp con un servidor HTTP CGI mínimo incorporado.

Lo que hace el plugin es que ejecuta un servidor web, sirve una página html con algunas variables especiales que reemplaza con datos reales bajo petición (lista de reproducción, cola de solicitud, tiempo restante en la canción, etc.).

Vi esto como un proyecto divertido y bueno para aprender algo de jQuery, así que comencé a conectar mi propio código js para reemplazar, reparar y ajaxify el sitio web servido desde el complemento, pero ahora tuve un problema con la codificación de caracteres .

En la página obtienes enlaces a todas las canciones de la lista de reproducción. Cuando haces clic en uno de los enlaces, conecto mi propia función de jQuery click. Entonces, en lugar de volver a cargar toda la página cuando solicitas una canción, hago $ .get ($ (this) .attr ('href', function (response) {... code ...}) y luego uso replaceWith para reemplace la cola actual con la nueva cola generada con su solicitud agregada sobre la marcha. Hago lo mismo para mostrar/actualizar la reproducción actual y en la búsqueda para que todo sea recuperado en el fondo y luego reemplazado sobre la marcha con algunas animaciones agregadas.

todo jQuery/Ajax funciona muy bien pero el gran problema que tengo es con juego de caracteres y con nombres de canciones en cola/lista de reproducción. los caracteres especiales (åäöé etc.) de nombres no funciona en absoluto.

el plug-in muestra todo en iso-8859-1/latin1 y mi metaetiqueta en el marcado le dice al navegador que esta página es latin1. En una página normal, actualice en th El navegador funciona bien y los caracteres especiales se muestran de forma normal. Pero cuando uso jQuery y $ .get() para reemplazar bloques de código sobre la marcha, los caracteres especiales solo aparecen como?.

Creo que el problema radica en que jQuery predetermina creer que la respuesta $ .get() es UTF-8 si no hay encabezado que indique lo contrario. El complemento no establece ningún encabezado para la codificación/juego de caracteres en absoluto y ya que no tengo control en todo el backend y qué cabeceras se establecen no puedo cambiar esto.

Las únicas cabeceras que recibo de la respuesta del plugin es:

Servidor: WinampServer
Connection: close
Content-Type: text/html

espero que entienda mi problema. Tengo una página donde no tengo ningún control sobre el backend y todo lo que tengo que trabajar es HTML generado. No puedo cambiar ni agregar encabezados en las respuestas. Necesito decirle a jQuery que la respuesta está realmente en latin1 y no en UTF-8 para que la codificación de los caracteres especiales no se rompa. He probado el scriptCharset: 'iso-8859-1' en jQuerys ajaxSetup pero eso solo funciona con type script/json y estoy trabajando con respuestas HTML.

¿Alguna idea de si esto es posible o cualquier otra solución que pueda pensar?

Respuesta

28

edición: ok, creo que esto funciona (al menos funcionó en mi entorno de prueba, véase las revisiones de intento anterior)

$.ajaxSetup({ 
    'beforeSend' : function(xhr) { 
     xhr.overrideMimeType('text/html; charset=UTF-8'); 
    }, 
}); 
$('#stuff').load('/yourresource.file'); // your ajax load 

lo que tenía era el principal archivo situado en UTF-8 y el archivo de datos establecido en ISO-8859-1. sin el código anterior, obtuve un montón de basura para la cadena de prueba åäöé, como esperaba.con el código anterior, cargó åäöé debidamente codificado.

+0

Lo he intentado también, pero eso no parece ayudar. Creo que solo establece la codificación de los datos que envía, no la codificación de los datos recibidos en la respuesta. –

+1

Creo que este nuevo método debería funcionar – Owen

+0

Woah, muchas gracias. Eso funciona como un encanto. Estaba listo para darme por vencido y aceptar que no era posible resolver mi problema. Pasé mucho tiempo probando diferentes cosas y buscando una solución en Google. Su beforeSend funcionó muy bien cuando configuré el juego de caracteres en iso-8859-1. –

0

Al principio, sería mejor si ha utilizado la función más general $ .ajax().

De acuerdo con documentation existe la opción scriptCharset, sin embargo, solo es aplicable en ciertos tipos de datos. También se afirma que esto es necesario solo si la codificación de la página de llamada es diferente.

0

Esto es solo para señalar que mientras que el método overrideMimeType() está disponible en los navegadores basados ​​en Gecko (Firefox, ...), NO está en IE (al menos < = 7), y parece haber no hay solución. (No sé sobre la disponibilidad en otros navegadores.)

Cuestiones relacionadas