172

我需要读取一个用 ISO-8859-1(也称为 latin1)编码的文件,如下所示:

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

但是,Node 抱怨“latin1”或“ISO-8859-1”不是有效编码(“错误:未知编码”)。

接受哪些编码readFileSync

4

4 回答 4

271

节点本身支持的编码列表相当短

  • ASCII
  • base64
  • base64url (节点 v14+)
  • 十六进制
  • 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');
}
于 2013-01-27T20:07:24.397 回答
7

编码在缓冲区文档中有详细说明。

缓冲区和字符编码

字符编码

  • utf8: 多字节编码的 Unicode 字符。许多网页和其他文档格式使用 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(Node v14+):RFC 4648 第 5 节中指定的 base64url 编码。从字符串创建缓冲区时,此编码也将正确接受常规 base64 编码的字符串。将 Buffer 编码为字符串时,此编码将省略填充。
  • hex:将每个字节编码为两个十六进制字符。

传统字符编码

  • ascii:仅适用于 7 位 ASCII 数据。通常,没有理由使用这种编码,因为在编码或解码纯 ASCII 文本时,“utf8”(或者,如果已知数据始终是纯 ASCII 数据,则为“latin1”)将是更好的选择。
  • binary: 'latin1' 的别名。
  • ucs2: 'utf16le' 的别名。
于 2020-10-05T13:54:09.883 回答
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 文档。这对我有用。

于 2013-04-16T19:10:07.413 回答
0

从 v12 开始,Node 支持以下编码值:

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

节点 v14 及更高版本添加base64url编码。

使用这个 shell 脚本来破解支持的编码:

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 回答