Estoy tratando de convertir un cuerpo HTML codificado en windows-1251 en utf-8 pero todavía tengo caracteres desordenados en html .
Básicamente son alfabeto ruso, pero no puedo hacer que se muestren correctamente. me sale ??????? ?? ???
const GOT = require('got') // https://www.npmjs.com/package/got const WIN1251 = require('windows-1251') // https://www.npmjs.com/package/windows-1251 async function query() { var body = Buffer.from(await GOT('https://example.net/', {resolveBodyOnly: true}), 'binary') var html = WIN1251.decode(body.toString('utf8')) console.log(html) } query()Estás haciendo un montón de codificación tonta de un lado a otro aquí. Y los 'atrás' ni siquiera coinciden con los 'adelante'.
Primero, usa la biblioteca got para descargar una página web; de forma predeterminada, got decodificará diligentemente los textos de respuesta como UTF-8 . Rellena la cadena Unicode devuelta en un Buffer con la codificación binary , que desecha el octeto superior de cada unidad de código UTF-16 de la cadena Unicode. Luego usa .toString('utf-8') que interpreta esta cadena mutilada como UTF-8 (en realidad, lo más probable es que no sea UTF-8 válido en absoluto). Luego, pasa la cadena 'UTF-8' a windows-1251 , para decodificarla como una cadena de 'página de códigos 1251'. Nada bueno puede salir de toda esta confusión.
El paquete windows-1251 que desea usar toma las llamadas cadenas 'binarias' (pseudo-Latin-1) como entrada. Lo que debe hacer en su lugar es tomar la respuesta binaria, interpretarla como una cadena Latin-1/'binary' y luego pasarla a la biblioteca de windows-1251 para su decodificación.
En otras palabras, usa esto:
const GOT = require('got'); const WIN1251 = require('windows-1251'); async function query() { const body = await GOT('https://example.net/', { resolveBodyOnly: true, responseType: 'buffer' }); const html = WIN1251.decode(body.toString('binary')) console.log(html) } query()