如何检测为文件定义了哪种编码?
我想要这样的事情:
fs.getFileEncoding('C:/path/to/file.txt') // it returns 'UTF-8', 'CP-1252', ...
使用nodejs本机函数有一种简单的方法吗?
答案 0 :(得分:2)
您可以使用完全执行此操作的npm模块:https://www.npmjs.com/package/detect-character-encoding
你可以像这样使用它:
const fs = require('fs');
const detectCharacterEncoding = require('detect-character-encoding');
const fileBuffer = fs.readFileSync('file.txt');
const charsetMatch = detectCharacterEncoding(fileBuffer);
console.log(charsetMatch);
// {
// encoding: 'UTF-8',
// confidence: 60
// }
答案 1 :(得分:2)
我认为没有“原生 Node.js 函数”可以做到这一点。
我知道的最简单的解决方案是使用像 detect-file-encoding-and-language 这样的 npm 模块。只要输入文件不是太小,它应该可以正常工作。
// Install plugin using npm
$ npm install detect-file-encoding-and-language
// Sample code
const languageEncoding = require("detect-file-encoding-and-language");
const pathToFile = "/home/username/documents/my-text-file.txt"
languageEncoding(pathToFile).then(fileInfo => console.log(fileInfo));
// Possible result: { language: japanese, encoding: Shift-JIS, confidence: { language: 0.97, encoding: 0.97 } }
答案 2 :(得分:1)
这是我一段时间以来一直在使用的。 YMMV。 希望对您有所帮助。
var fs = require('fs');
...
getFileEncoding( f ) {
var d = new Buffer.alloc(5, [0, 0, 0, 0, 0]);
var fd = fs.openSync(f, 'r');
fs.readSync(fd, d, 0, 5, 0);
fs.closeSync(fd);
// https://en.wikipedia.org/wiki/Byte_order_mark
var e = false;
if ( !e && d[0] === 0xEF && d[1] === 0xBB && d[2] === 0xBF)
e = 'utf8';
if (!e && d[0] === 0xFE && d[1] === 0xFF)
e = 'utf16be';
if (!e && d[0] === 0xFF && d[1] === 0xFE)
e = 'utf16le';
if (!e)
e = 'ascii';
return e;
}
答案 3 :(得分:0)
我使用了encoding-japanese软件包,效果很好。
示例:
var encoding = require('encoding-japanese');
var fileBuffer = fs.readFileSync('file.txt');
console.log(encoding.detect(fileBuffer))
可用的编码:
它可以在节点或浏览器中使用。哦,它具有零依赖。