Lista de codificaciones que admite Node.js


136

Necesito leer un archivo que está codificado con ISO-8859-1 (también llamado latin1), algo como esto:

var file_contents = fs.readFileSync("test_data.html", "latin1");

Sin embargo, Node se queja de que "latin1" o "ISO-8859-1" no es una codificación válida ("Error: codificación desconocida").

¿Qué codificaciones readFileSyncacepta?


No sé si es una opción para convertir el archivo fuente a utf8. Si es así, aquí hay un enlace. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
— mathheadinclouds

Respuestas:


223

La lista de codificaciones que el nodo admite de forma nativa es bastante corta:

  • ascii
  • base64
  • maleficio
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binario / latin1 (ISO8859-1, latin1 solo en el nodo 6.4.0+)

Si está utilizando una versión anterior a 6.4.0, o no quiere tratar con codificaciones que no sean Unicode, puede volver a codificar la cadena:

Use iconv-lite para recodificar archivos:

var iconvlite = require('iconv-lite');
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    return iconvlite.decode(content, encoding);
}

Alternativamente, use iconv :

var Iconv = require('iconv').Iconv;
var fs = require('fs');

function readFileSync_encoding(filename, encoding) {
    var content = fs.readFileSync(filename);
    var iconv = new Iconv(encoding, 'UTF-8');
    var buffer = iconv.convert(content);
    return buffer.toString('utf8');
}

1
Para aquellos que tienen problemas compilando iconv, les recomiendo iconv-lite . No requiere compilación y, según el desarrollador, es más rápido que iconv y es utilizado por herramientas populares como Grunt, Nodemailer, Yeoman, ...
— Telémako

Para usar con Electron, instale lib y guarde como dependencia de producción:npm install iconv-lite --save
— DenisKolodin

por ahora, latin1también se incluye como alias deascii
— thybzi

2
Lo que dijo en la respuesta, que ISO-8859-1 (aka latin1) no es compatible, no es el caso del Nodo v8.1.4. Consulte esta página de documentación para ver todas las codificaciones admitidas por Buffer, que incluyen latin1(cuyo alias es binary).
— nbkhope

1
@PanuLogic Cuando convierte de una cadena de bytes a una cadena de caracteres, necesita algo de codificación. latin1es reversible: incluso si su entrada es un archivo de video mp4, la cadena será válida (aunque no tenga sentido), y la conversión de nuevo a bytes producirá los bytes originales. Utilice a Buffer/ Uint8Arraypara datos binarios.
— phihag

0

Si la solución anterior no funciona para usted, es posible obtener el mismo resultado con el siguiente código de nodejs puro. Lo anterior no funcionó para mí y resultó en una excepción de compilación al ejecutar 'npm install iconv' en OSX:

npm install iconv

npm WARN package.json portalServer@0.1.0 No README.md file found!
npm http GET https://registry.npmjs.org/iconv
npm http 200 https://registry.npmjs.org/iconv
npm http GET https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz
npm http 200 https://registry.npmjs.org/iconv/-/iconv-2.0.4.tgz

> iconv@2.0.4 install /Users/markboyd/git/portal/app/node_modules/iconv
> node-gyp rebuild

gyp http GET http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
gyp http 200 http://nodejs.org/dist/v0.10.1/node-v0.10.1.tar.gz
xcode-select: Error: No Xcode is selected. Use xcode-select -switch <path-to-xcode>, or see the xcode-select manpage (man xcode-select) for further information.

fs.readFileSync () devuelve un Buffer si no se especifica codificación. Y Buffer tiene un método toString () que se convertirá a UTF8 si no se especifica una codificación que le brinde el contenido del archivo. Consulte la documentación de nodejs. Esto funcionó para mí.


1
El problema es que el Buffer asume que los datos ya estaban en utf8 si no se especifica, y no intentará convertir de latin1 a utf8.
— bluesmoon
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.