Node.js支持的编码列表

时间:2013-01-27 20:01:56

标签: node.js

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

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

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

readFileSync接受哪些编码?

3 个答案:

答案 0 :(得分:174)

该节点本身支持的list of encodings相当短:

  • 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);
}

或者,使用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 :(得分:1)

buffer documentation中详细说明了编码。

Buffers and character encodings

字符编码

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

二进制文本编码

  • base64 :Base64编码。从字符串创建缓冲区时,此编码还将正确接受RFC 4648第5节中指定的“ URL和文件名安全字母”。
  • hex :将每个字节编码为两个十六进制字符。

旧版字符编码

  • ascii :仅适用于7位ASCII数据。通常,在编码或解码纯ASCII文本时,使用“ utf8”(或如果已知数据始终仅是ASCII,则“ latin1”)将是没有更好的选择。< / li>
  • binary :“ latin1”的别名。
  • ucs2 :“ utf16le”的别名。

答案 2 :(得分: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文档。这对我有用。