var iconvlite = require('iconv-lite');
var fs = require('fs');
function readFileSync_encoding(filename, encoding) {
var content = fs.readFileSync(filename);
return iconvlite.decode(content, encoding);
}
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');
}
4条答案
按热度按时间qf9go6mv1#
node本身支持的list of encodings非常短:
如果你使用的是比6.4.0更旧的版本,或者不想处理非Unicode编码,你可以重新编码字符串:
使用iconv-lite重新编码文件:
或者,使用iconv:
ssgvzors2#
编码在buffer documentation中详细说明。
缓冲区和字符编码:
字符编码
*一月一日:多字节编码的Unicode字符。许多网页和其他文档格式使用UTF-8。这是默认的字符编码。
*
utf16le
:多字节编码的Unicode字符。与utf8
不同,字符串中的每个字符将使用2或4个字节进行编码。*
latin1
:Latin-1代表ISO-8859-1。此字符编码仅支持从U+0000
到U+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”。
vpfxa7rd3#
从v12开始,Node支持以下编码值:
ascii
base64
hex
latin1
ucs2
utf16le
utf8
节点v14及以后增加
base64url
编码。使用这个shell脚本可以从每个版本的Node中轻松提取支持的编码:
fafcakar4#
如果上面的解决方案对你不起作用,你可以使用下面的纯nodejs代码来获得相同的结果。上面的代码对我不起作用,并且在OSX上运行'npm install iconv'时导致编译异常:
fs.readFileSync()在没有指定编码的情况下返回一个Buffer。Buffer有一个toString()方法,如果没有指定编码,它将转换为UTF8,从而提供文件的内容。请参阅nodejs文档。这对我很有效。