所以,我正在尝试在前端使用AngularJS编写CSV文件导入程序,在后端使用NodeJS编写。 我的问题是,我不确定传入的CSV文件的编码。有没有办法自动检测它?
我首先尝试使用FileReader.readAsDataURL()并在Node中进行检测。但是文件内容将是Base64编码的,所以我不能这样做(当我解码文件时,我已经需要知道编码)。 如果我做FileReader.readAsText(),我还需要事先知道编码。在初始化FileReader之前我也做不到,因为实际的文件对象似乎不包含文件内容。
我目前的代码:
generateFile = function(file){
reader = new FileReader();
reader.onload = function (evt) {
if (checkSize(file.size) && isTypeValid(file.type)) {
scope.$apply(function () {
scope.file = evt.target.result;
file.encoding = Encoding.detect(scope.file);
if (angular.isString(scope.fileName)) {
return scope.fileName = name;
}
});
if (form) {
form.$setDirty();
}
scope.fileArray.push({
name: file.name,
type: file.type,
size: file.size,
date: file.lastModified,
encoding: file.encoding,
file: scope.file
});
--scope.pending;
if (scope.pending === 0){
scope.$emit('file-dropzone-drop-event', scope.fileArray);
scope.fileArray = [];
}
}
};
let fileExtExpression = /\.csv+$/i;
if(fileExtExpression.test(file.name)){
reader.readAsText(file);
}
else{
reader.readAsDataURL(file);
}
++scope.pending;
}
这是不可能的,或者我做错了什么?我甚至尝试使用FileReader.readAsArrayBuffer()来解决这个问题并从那里提取文件头,但这对我来说太复杂了,并且/或者似乎无法正常工作。
答案 0 :(得分:2)
你可以试试这个:
$ npm install detect-file-encoding-and-language
然后像这样检测编码:
// index.js
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: 1 } }
答案 1 :(得分:0)
我建议您使用 FileReader 中的readAsBinaryString()
打开CSV。这是诀窍。然后,您可以使用库jschardet