2012-01-18 15 views
7

Estoy a punto de escribir un buscador de fuentes RSS y de algunos problemas del juego de caracteres.respuestas codificadas en http.get e ISO-8859-1

Cargando y analizando la alimentación fue bastante fácil en comparación con la codificación. Estoy cargando el feed con http.get y estoy reuniendo los fragmentos en cada evento de datos. Más tarde estoy analizando toda la cadena con el npm-lib feedparser que funciona bien con la cadena dada.

Lamentablemente estoy acostumbrado a funciones como utf8_encode() en php y me faltan en node.js, así que estoy atascado con el uso de Iconv que actualmente no está haciendo lo que quiero.

Sin codificación UTF-8 hay varios Iconos-bebé para el juego de caracteres erróneo, con iconv, la serie se analiza equivocada:?/

Actualmente estoy codificación de cada cuerda seperatedly:

//var encoding ≈ ISO-8859-1 etc. (Is the right one, checked with docs etc.) 
// Shortend version 

var iconv = new Iconv(encoding, 'UTF-8'); 

parser.on('article', function(article){ 
    var object = { 
     title : iconv.convert(article.title).toString('UTF-8'), 
     description : iconv.convert(article.summary).toString('UTF-8') 
    } 
    Articles.push(object); 
}); 

¿Debo empezar codificación con buffer de datos o más tarde con la cadena completa?

¡Gracias!

PS: La codificación se determinó con el análisis de la cabeza xml

¿Qué tal un módulo que hace que la codificación en Node.js más fácil?

+0

Es lo que no has de trabajar? – loganfsmyth

+0

No puedo obtener la codificación iconv a la derecha – moe

+0

¿Entonces los objetos del artículo no están codificados correctamente y en su lugar contienen basura? ¿Y podrías mostrar el feed? – fent

Respuesta

9

Probablemente esté golpeando el mismo problema descrito en https://groups.google.com/group/nodejs/browse_thread/thread/b2603afa31aada9c.

La solución parece ser establecer la codificación de respuesta en binario antes de procesar el búfer con Iconv.

El bit relevante es

response.setEncoding conjunto ('binario') y agregar los trozos en un búfer antes de llamar Iconv.convert(). Tenga en cuenta que la codificación = binario significa que su devolución de datos recibirá los objetos Buffer, no las cadenas.


Actualizado: Esta fue mi respuesta inicial

¿Estás seguro de que la fuente que está recibiendo se ha codificado correctamente?

I puede ver dos errores posibles:

  1. la alimentación se envía con datos codificados-Latin-1, pero con un Content-Type que indica charset=UTF-8.
  2. el feed se está enviando con datos codificados en UTF-8 pero el encabezado Content-Type no indica nada, por defecto a ASCII.

Debe verificar el contenido de su feed y los encabezados enviados con alguna utilidad como Wireshark o cURL.

+0

im trabajando con moe- la fuente es http : //www.spiegel.de/schlagzeilen/tops/index.rss –

+0

Estoy bastante seguro de que el contenido está codificado en ISO-8859-1. Content-Header y el encabezado de la coincidencia de xml-file. – moe

+0

De hecho, parece estar codificado correctamente. Actualicé mi respuesta para sugerir otra solución. – gioele

1

Creo que el problema probablemente radique en la forma en que está almacenando los datos antes de pasarlos al programador de información.Es difícil de decir sin ver el controlador de eventos de datos, pero voy a suponer que usted está haciendo algo como esto:

values = ''; 
stream.on('data', function(chunk){ 
    values += chunk; 
}); 

¿Es eso cierto?

El problema es que en este caso, el fragmento es un búfer, y al usar '+' para anexarlos todos juntos, implícitamente convierte el búfer en una cadena.

Al examinarlo más, realmente debería estar haciendo la conversión de iconv en todo el feed, antes de ejecutarlo a través del feedparser, porque es probable que el programa de compresión no tenga conocimiento de otras codificaciones.

intentar algo como esto:

var iconv = new Iconv('ISO-8859-1', 'UTF8'); 
var chunks = []; 
var totallength = 0; 
stream.on('data', function(chunk) { 
    chunks.push(chunk); 
    totallength += chunk.length; 
}); 
stream.on('end', function() { 
    var results = new Buffer(totallength); 
    var pos = 0; 
    for (var i = 0; i < chunks.length; i++) { 
    chunks[i].copy(results, pos); 
    pos += chunks[i].length; 
    } 
    var converted = iconv.convert(results); 
    parser.parseString(converted.toString('utf8')); 
}); 
Cuestiones relacionadas