Node.jsがサポートするエンコーディングのリスト


136

次のような、ISO-8859-1(latin1とも呼ばれる)でエンコードされたファイルを読み取る必要があります。

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

ただし、Nodeは、「latin1」または「ISO-8859-1」が有効なエンコーディングではない(「エラー:不明なエンコーディング」)と文句を言います。

どのエンコーディングがreadFileSync受け入れますか?


ソースファイルをutf8に変換するオプションかどうかはわかりません。もしそうなら、ここにリンクがあります。superuser.com/questions/762473/ansi-to-utf-8-in-notepad
— mathheadinclouds 2017年

回答:


223

ノードがネイティブにサポートするエンコーディングのリストはかなり短いです:

  • アスキー
  • base64
  • ヘックス
  • ucs2 / ucs-2 / utf16le / utf-16le
  • utf8 / utf-8
  • binary / latin1(ISO8859-1、latin1はノード6.4.0以降のみ)

6.4.0より古いバージョンを使用している場合、または非Unicodeエンコーディングを処理したくない場合は、文字列を再コード化できます。

iconv-liteを使用してファイルを再コード化します。

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

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

または、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
iconvのコンパイルに問題がある場合は、iconv-liteをお勧めします。これは、コンパイルを必要とし、DEVによれば速いのiconvよりも、それはうなり声、Nodemailer、ヨーマン、...のような人気のあるツールで使用されていません
— Telémako

Electronを使用してlibをインストールし、プロダクションの依存関係として保存するには:npm install iconv-lite --save
— DenisKolodin

今のところ、latin1別名として含まれていますascii
— thybzi

2
あなたが答えで言ったこと-ISO-8859-1(別名latin1)はサポートされていません-はNode v8.1.4には当てはまりません。参照してください。このドキュメントのページを含めるバッファでサポートされているすべてのエンコーディングを参照するためにlatin1(その別名であるがbinary)。
— nbkhope 2017

1
@PanuLogicバイト文字列から文字列に変換する場合、エンコードが必要です。latin1は可逆的です–入力がmp4ビデオファイルであっても、文字列は有効です(無意味です)。バイトに変換すると、元のバイトが返されます。バイナリデータにはBuffer/ Uint8Arrayを使用します。
— phihag

0

上記の解決策がうまくいかない場合は、次の純粋なnodejsコードで同じ結果を得ることができる場合があります。上記は私にとっては機能せず、OSXで「npm install iconv」を実行するとコンパイル例外が発生しました。

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()はBufferを返します。また、BufferにはtoString()メソッドがあり、ファイルのコンテンツを提供するエンコーディングが指定されていない場合、UTF8に変換されます。nodejsのドキュメントを参照してください。これでうまくいきました。


1
問題は、バッファーが指定されていない場合、データがすでにutf8にあると想定し、latin1からutf8への変換を試みないことです。
— bluesmoon 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.