大佬教程收集整理的这篇文章主要介绍了利用js判断文件是否为utf-8编码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
使用 FileReader 以utf-8格式读取文件,根据文件内容是否包含乱码字符 � ,来判断文件是否为utf-8。
如果存在 �,即文件编码非utf-8,反之为utf-8。
代码如下:
const isUtf8 = async (file: FilE) => {
return await new @H_801_16@Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsText(filE);
reader.onloadend = (e: any): void => {
const content = e.target.result;
const encodingRight = content.indexOf("") === -1;
if (encodingRight) {
resolve(encodingRight);
} else {
reject(new @H_801_16@Error("编码格式错误,请上传 UTF-8 格式文件"));
}
};
reader.onerror = () => {
reject(new @H_801_16@Error("文件内容读取失败,请检查文件是否损坏"));
};
});
};
该方法问题在于,如果文件非常大,比如几个G,浏览器读到的内容直接放在内存中,fileReader实例会直接触发onerror,抛出错误,有时浏览器会直接崩溃。
https://www.98891.com/article-68-1.html
对于大文件,可以对文件内容进行抽样,对文件进行切片,这里使用 100 片。对切出的每片文件再切取前面 1kb 大小的片段,以 String 方式读取。如果 1024B 可能正好切在某个汉字编码的中间,导致以 String 方式读取时出错,即首尾可能出现 � ,被认为是非utf-8片段。这时可以取 1kb 对应字符串的前半段,再去判断 � 是否存在。
上述常数可以根据需求进行调整。
代码如下:
const getSamples = (file: FilE) => {
const filesize = file.size;
const parts: Blob[] = [];
if (filesize < 50 * 1024 * 1024) {
parts.push(filE);
} else {
let @R_259_10586@l = 100;
const sampleSize = 1024 * 1024;
const chunkSize = Math.floor(filesize / @R_259_10586@l);
let start = 0;
let end = sampleSize;
while (@R_259_10586@l > 1) {
parts.push(file.slice(start, end));
start += chunkSize;
end += chunkSize;
@R_259_10586@l--;
}
}
return parts;
};
const isUtf8 = (filePart: Blob) => {
return new Promise((resolve, reject) => {
const fileReader = new FileReader();
fileReader.readAsText(filePart);
fileReader.onload = (E) => {
const str = e.target?.result as String;
// 大致取一半
const sampleStr = str?.slice(4, 4 + str?.length / 2);
if (sampleStr.indexOf("�") === -1) {
resolve(void 0);
} else {
reject(new Error(编码格式错误,请上传 UTF-8 格式文件"));
}
};
fileReader.onerror = () => {
reject(new Error(文件内容读取失败,请检查文件是否损坏"));
};
});
};
export default async function (file: FilE) {
const samples = getSamples(filE);
let res = true;
for (const filePart of samples) {
try {
await isUtf8(filePart);
} catch (error) {
res = false;
break;
}
}
return res;
}
以上是大佬教程为你收集整理的利用js判断文件是否为utf-8编码全部内容,希望文章能够帮你解决利用js判断文件是否为utf-8编码所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。