Node.js'nin desteklediği kodlamaların listesi


136

ISO-8859-1 (latin1 olarak da adlandırılır) ile kodlanmış bir dosyayı okumam gerekiyor, bunun gibi bir şey:

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

Ancak Düğüm, "latin1" veya "ISO-8859-1" in geçerli bir kodlama olmadığından şikayet eder ("Hata: Bilinmeyen kodlama").

Hangi kodlamaları readFileSynckabul ediyor?


Kaynak dosyayı utf8'e dönüştürme seçeneği olup olmadığını bilmiyorum. Eğer öyleyse, işte bir bağlantı. superuser.com/questions/762473/ansi-to-utf-8-in-notepad
mathheadinclouds

Yanıtlar:


222

Kodlamaların listesi düğüm destekleri doğal oldukça kısa olduğundan:

  • aSCII
  • base64
  • büyü
  • UCS2 / UCS2 / utf16le / utf16le
  • utf8 / utf8
  • ikili / latin1 (ISO8859-1, latin1 yalnızca 6.4.0+ düğümünde)

6.4.0'dan daha eski bir sürüm kullanıyorsanız veya Unicode olmayan kodlamalarla uğraşmak istemiyorsanız dizeyi yeniden kodlayabilirsiniz:

Dosyaları yeniden kodlamak için iconv-lite kullanın :

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

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

Alternatif olarak, iconv kullanın :

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
İconv'yi derlemekte sorun yaşayanlar için iconv-lite öneririm . Derleme gerektirmez ve geliştiriciye göre iconv'den daha hızlıdır ve Grunt, Nodemailer, Yeoman, ... gibi popüler araçlar tarafından kullanılır.
Telémako

Electron kurulum kütüphanesi ile kullanmak ve üretim bağımlılığı olarak kaydetmek için:npm install iconv-lite --save
DenisKolodin

Şimdilik, latin1aynı zamanda takma adı olarak da eklenmiştirascii
thybzi

2
latin1Yanıtta söylediğiniz - ISO-8859-1 (aka ) desteklenmiyor - Node v8.1.4 için geçerli değil. Bkz bu belgeler sayfasını dahil Tampon tarafından desteklenen tüm kodlamaları, görmek için latin1(kimin takma adıdır binary).
nbkhope

1
@PanuLogic Bir bayt dizesinden bir karakter dizesine dönüştürdüğünüzde, biraz kodlamaya ihtiyacınız vardır . latin1tersine çevrilebilir - girişiniz bir mp4 video dosyası olsa bile, dize geçerli olacaktır (anlamsız olsa da) ve bayta geri dönüştürmek orijinal baytları verecektir. İkili veriler için a Buffer/ kullanın Uint8Array.
phihag

0

Yukarıdaki çözüm sizin için işe yaramazsa, aşağıdaki saf nodejs kodu ile aynı sonucu elde etmek mümkün olabilir. Yukarıdakiler benim için işe yaramadı ve OSX'te 'npm install iconv' çalıştırırken bir derleme istisnasına neden oldu:

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 (), kodlama belirtilmezse bir Buffer döndürür. Ve Buffer, dosyanın içeriğini verecek bir kodlama belirtilmezse UTF8'e dönüşecek bir toString () yöntemine sahiptir. Nodejs belgelerine bakın. Bu benim için çalıştı.


1
Sorun şu ki, Buffer, belirtilmemişse verilerin zaten utf8'de olduğunu varsayar ve latin1'den utf8'e dönüştürme girişiminde bulunmaz.
bluesmoon
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.