如何在NodeJS中检测文件编码?

Hem*_*dal 5 encoding file node.js

如何检测为文件定义了哪种编码?

我想要这样的东西:

fs.getFileEncoding('C:/path/to/file.txt') // it returns 'UTF-8', 'CP-1252', ...
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用nodejs本机函数来做到这一点?

Fal*_*aen 7

我不认为有一个“原生 Node.js 函数”可以做到这一点。

我知道的最简单的解决方案是使用 npm 模块,例如detector-file-encoding-and-language。只要输入文件不太小,它就应该可以正常工作。

// Install plugin using npm

$ npm install detect-file-encoding-and-language
Run Code Online (Sandbox Code Playgroud)
// 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 } }
Run Code Online (Sandbox Code Playgroud)


Dea*_*Eye 6

You can use an npm module that does exactly this: https://www.npmjs.com/package/detect-character-encoding

You can use it like this:

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
// }
Run Code Online (Sandbox Code Playgroud)

  • 您提到的项目不适用于Windows。还有其他效果好的工具吗? (2认同)

Mar*_*ire 5

这就是我已经使用了一段时间了。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;
Run Code Online (Sandbox Code Playgroud)

}

Run Code Online (Sandbox Code Playgroud)


Don*_*n P 4

我使用了encoding-japanese包,效果很好。

例子 :

var encoding = require('encoding-japanese');
var fileBuffer = fs.readFileSync('file.txt');
console.log(encoding.detect(fileBuffer))
Run Code Online (Sandbox Code Playgroud)

可用的编码:

  • 'UTF32'(仅检测)
  • ‘UTF16’
  • 'UTF16BE'
  • 'UTF16LE'
  • 'BINARY'(仅检测)
  • 'ASCII'(仅检测)
  • 'JIS'
  • 'UTF8'
  • 'EUCJP'
  • 'SJIS'
  • 'UNICODE'(JavaScript Unicode 数组)

它可以在节点或浏览器中使用。哦...而且它是零依赖的