Lista de codificações suportadas pelo Node.js.


136

Preciso ler um arquivo codificado com ISO-8859-1 (também chamado latin1), algo como isto:

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

No entanto, o Node reclama que "latin1" ou "ISO-8859-1" não é uma codificação válida ("Erro: codificação desconhecida").

Quais codificações readFileSyncaceitam?


Não sei se é uma opção para converter o arquivo de origem em utf8. Se sim, aqui está um link. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
mathheadinclouds

Respostas:


223

A lista de codificações que o nó suporta nativamente é bastante curta:

  • ascii
  • base64
  • hex
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binário / latin1 (ISO8859-1, latin1 apenas no nó 6.4.0+)

Se você estiver usando uma versão anterior à 6.4.0 ou não quiser lidar com codificações não-Unicode, poderá recodificar a sequência:

Use iconv-lite para recodificar arquivos:

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

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

Como alternativa, 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 aqueles que têm problemas para compilar iconv, recomendo iconv-lite . Ele não requer compilação e de acordo com o dev é mais rápido que iconv e é usado por ferramentas populares como Grunt, Nodemailer, Yeoman, ...
Telémako

Para usar com Electron instalar lib e salvar como dependência de produção:npm install iconv-lite --save
Denis Kolodin

por enquanto, latin1também está incluído como alias deascii
thybzi 24/10

2
O que você disse na resposta - que o ISO-8859-1 (aka latin1) não é suportado - não é o caso do Nó v8.1.4. Consulte esta página de documentação para ver todas as codificações suportadas pelo Buffer, que incluem latin1(cujo apelido é binary).
Nbkhope

1
@PanuLogic Ao converter de uma sequência de bytes em uma sequência de caracteres, você precisa de alguma codificação. latin1é reversível - mesmo que sua entrada seja um arquivo de vídeo mp4, a string será válida (embora sem sentido) e a conversão em bytes produzirá os bytes originais. Use a Buffer/ Uint8Arraypara dados binários.
phihag

0

Se a solução acima não funcionar para você, poderá ser possível obter o mesmo resultado com o seguinte código nodejs puro. O exemplo acima não funcionou para mim e resultou em uma exceção de compilação ao executar o 'npm install iconv' no 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 () retorna um buffer se nenhuma codificação for especificada. E o Buffer possui um método toString () que será convertido em UTF8 se nenhuma codificação for especificada, fornecendo o conteúdo do arquivo. Consulte a documentação do nodejs. Isso funcionou para mim.


1
O problema é que o Buffer assume que os dados já estavam no utf8, se não especificados, e não fará nenhuma tentativa de converter de latin1 em utf8.
Bluesmoon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.