172

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

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

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

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

4

4 に答える 4

271

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

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

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');
}
于 2013-01-27T20:07:24.397 に答える
7

エンコーディングは、バッファのドキュメントで詳しく説明されています。

バッファと文字エンコード

文字エンコード

  • utf8:マルチバイトでエンコードされたUnicode文字。多くのWebページやその他のドキュメント形式はUTF-8を使用しています。これはデフォルトの文字エンコードです。
  • utf16le:マルチバイトでエンコードされたUnicode文字。とは異なりutf8、文字列内の各文字は2バイトまたは4バイトのいずれかを使用してエンコードされます。
  • latin1:Latin-1はISO-8859-1の略です。この文字エンコードは、からU+0000までのUnicode文字のみをサポートしU+00FFます。

バイナリからテキストへのエンコーディング

  • base64:Base64エンコーディング。文字列からバッファを作成する場合、このエンコーディングは、RFC 4648のセクション5で指定されているように、「URLとファイル名の安全なアルファベット」も正しく受け入れます。
  • base64url(ノードv14 +):RFC 4648、セクション5で指定されているbase64urlエンコーディング。文字列からバッファを作成する場合、このエンコーディングは通常のbase64エンコード文字列も正しく受け入れます。バッファを文字列にエンコードする場合、このエンコードではパディングが省略されます。
  • hex:各バイトを2つの16進文字としてエンコードします。

レガシー文字エンコーディング

  • ascii:7ビットASCIIデータの場合のみ。ASCIIのみのテキストをエンコードまたはデコードする場合は、「utf8」(または、データが常にASCIIのみであることがわかっている場合は、「latin1」)の方が適しているため、通常、このエンコードを使用する理由はありません。
  • binary:「latin1」のエイリアス。
  • ucs2:「utf16le」のエイリアス。
于 2020-10-05T13:54:09.883 に答える
0

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

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にはtoString()メソッドがあり、エンコードが指定されていない場合はUTF8に変換され、ファイルの内容が提供されます。nodejsのドキュメントを参照してください。これは私のために働いた。

于 2013-04-16T19:10:07.413 に答える
0

v12以降、Nodeは次のエンコーディング値をサポートします。

  • ascii
  • base64
  • hex
  • latin1
  • ucs2
  • utf16le
  • utf8

ノードv14以降はbase64urlコーディングを追加します。

このシェルスクリプトを使用して、サポートされているエンコーディングをハッキーに抽出します。

for v in {12..17}; do echo v$v; curl -L https://raw.githubusercontent.com/nodejs/node/v$v.x/lib/buffer.js --silent | grep -A 100000 'const encodingOps' | grep -B 100000 -E '^}' -m 1 | grep -Eo '^  [^ :}]+' | grep -Eo '[^ ]+' | sort; echo ---; done
于 2022-02-25T19:11:06.420 に答える