Liste des encodages pris en charge par Node.js


136

J'ai besoin de lire un fichier encodé avec ISO-8859-1 (également appelé latin1), quelque chose comme ceci:

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

Cependant, Node se plaint que "latin1" ou "ISO-8859-1" n'est pas un encodage valide ("Erreur: encodage inconnu").

Quels encodages readFileSyncaccepte-t-il?


Je ne sais pas si c'est une option pour convertir le fichier source en utf8. Si oui, voici un lien. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
— mathheadinclouds

Réponses:


223

La liste des encodages supportés nativement par le nœud est assez courte:

  • ascii
  • base64
  • hexadécimal
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binaire / latin1 (ISO8859-1, latin1 uniquement dans le nœud 6.4.0+)

Si vous utilisez une version antérieure à la 6.4.0 ou que vous ne souhaitez pas traiter des encodages non Unicode, vous pouvez recoder la chaîne:

Utilisez iconv-lite pour recoder les fichiers:

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

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

Vous pouvez également utiliser 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
Pour ceux qui ont des problèmes pour compiler iconv, je recommande iconv-lite . Il ne nécessite pas de compilation et selon le dev est plus rapide que iconv et il est utilisé par des outils populaires comme Grunt, Nodemailer, Yeoman, ...
— Telémako

À utiliser avec la bibliothèque d'installation Electron et à enregistrer en tant que dépendance de production:npm install iconv-lite --save
— DenisKolodin

pour l'instant, latin1est également inclus comme alias deascii
— thybzi

2
Ce que vous avez dit dans la réponse - que ISO-8859-1 (aka latin1) n'est pas pris en charge - n'est pas le cas pour Node v8.1.4. Consultez cette page de documentation pour voir tous les encodages pris en charge par Buffer, qui incluent latin1(dont l'alias est binary).
— nbkhope

1
@PanuLogic Lorsque vous convertissez une chaîne d'octets en chaîne de caractères, vous avez besoin d'un certain codage. latin1est réversible - même si votre entrée est un fichier vidéo mp4, la chaîne sera valide (bien que sans signification), et la reconversion en octets produira les octets d'origine. Utilisez un Buffer/ Uint8Arraypour les données binaires.
— phihag le

0

Si la solution ci-dessus ne fonctionne pas pour vous, il est possible d'obtenir le même résultat avec le code nodejs pur suivant. Ce qui précède n'a pas fonctionné pour moi et a entraîné une exception de compilation lors de l'exécution de 'npm install iconv' sur 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 () renvoie un Buffer si aucun encodage n'est spécifié. Et Buffer a une méthode toString () qui se convertira en UTF8 si aucun encodage n'est spécifié vous donnant le contenu du fichier. Consultez la documentation nodejs. Cela a fonctionné pour moi.


1
Le problème est que le tampon suppose que les données étaient déjà dans utf8 si elles ne sont pas spécifiées, et ne tentera pas de convertir de latin1 en utf8.
— bluesmoon
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.