Node.js支持的编码列表

dsi*_*ign 118 node.js

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

var file_contents = fs.readFileSync("test_data.html", "latin1");
Run Code Online (Sandbox Code Playgroud)

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

编码readFileSync接受的是什么?

phi*_*hag 196

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

  • ASCII
  • BASE64
  • 二进制
  • 十六进制
  • UCS2/UCS2/utf16le应按/ utf16le应按
  • UTF8/UTF8
  • latin1(ISO8859-1,仅在节点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);
}
Run Code Online (Sandbox Code Playgroud)

或者,使用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');
}
Run Code Online (Sandbox Code Playgroud)

  • 对于那些编译 iconv 时遇到问题的人,我推荐 [iconv-lite](https://github.com/ashtuchkin/iconv-lite)。它不需要编译,根据开发人员的说法,它比 iconv 更快,并且它被 Grunt、Nodemailer、Yeoman 等流行工具使用。 (2认同)
  • 你在答案中说的是 - 不支持ISO-8859-1(又名`latin1`) - 不是Node v8.1.4的情况.请参阅[本文档页面](https://nodejs.org/api/buffer.html#buffer_buffers_and_character_encodings)以查看Buffer支持的所有编码,包括`latin1`(其别名为`binary`). (2认同)
  • @PanuLogic当您从字节字符串转换为字符串时,您需要_some_编码。`latin1` 是可逆的 - 即使您的输入是 mp4 视频文件,该字符串也将是有效的(尽管毫无意义),并且转换回字节将产生原始字节。使用 [`Buffer`](https://nodejs.org/api/buffer.html)/`Uint8Array` 来存储二进制数据。 (2认同)

Kyl*_*Mit 19

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

缓冲区和字符编码

字符编码

  • 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”的别名。