Node.js支持的编码列表

6za6bjd0  于 2023-04-05  发布在  Node.js
关注(0)|答案(4)|浏览(200)

我需要读取一个使用ISO-8859-1(也称为latin 1)编码的文件,类似于以下内容:

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

但是,Node会抱怨“latin 1”或“ISO-8859-1”不是有效的编码(“错误:未知编码”)。
readFileSync接受什么编码?

qf9go6mv

qf9go6mv1#

node本身支持的list of encodings非常短:

  • ASCII码
  • base64
  • base64url(Node v14+)
  • 十六进制
  • ucs2/ucs-2/utf16le/utf-16le
  • utf8/utf-8
  • 二进制/latin 1(ISO 8859 -1,latin 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);
}

或者,使用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');
}
ssgvzors

ssgvzors2#

编码在buffer documentation中详细说明。

缓冲区和字符编码:

字符编码

*一月一日:多字节编码的Unicode字符。许多网页和其他文档格式使用UTF-8。这是默认的字符编码。
*utf16le:多字节编码的Unicode字符。与utf8不同,字符串中的每个字符将使用2或4个字节进行编码。
*latin1:Latin-1代表ISO-8859-1。此字符编码仅支持从U+0000U+00FF的Unicode字符。

二进制转文本编码

*base64:Base64编码。当从字符串创建Buffer时,此编码也将正确接受RFC 4648第5节中指定的“URL和文件名安全字母表”。
*base64url(节点v14+):RFC 4648第5节中指定的base64 url编码。当从字符串创建Buffer时,此编码也将正确接受常规的base64编码字符串。当将Buffer编码为字符串时,此编码将省略填充。
*hex:将每个字节编码为两个十六进制字符。

传统字符编码

*ascii:仅适用于7位ASCII数据。通常,没有理由使用此编码,因为在编码或解码仅ASCII文本时,'utf8'(或者,如果已知数据始终是ASCII专用的,则'latin 1')将是更好的选择。
*binary:拉丁语1的别名
*一米十一米一x:别名为“utf 16 le”。

vpfxa7rd

vpfxa7rd3#

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

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

节点v14及以后增加base64url编码。
使用这个shell脚本可以从每个版本的Node中轻松提取支持的编码:

for v in {12..19}; 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
fafcakar

fafcakar4#

如果上面的解决方案对你不起作用,你可以使用下面的纯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文档。这对我很有效。

相关问题