摘要
用JavaScript判断文档是否为UTF-8编码,就像是在寻找真爱一样,需要仔细观察文档内容中是否有错码标识符�。如果有,那么这份文档就不是UTF-8编码,否则就是。
正文
运用js分辨文档是不是为utf-8编号
基本计划方案
应用FileReader
以utf-8文件格式读取文件,依据文档內容是不是包括错码标识符�
,来分辨文档是不是为utf-8。
假如存有�
,即文档编号非utf-8,相反为utf-8。
编码以下:
const isUtf8 = async (file: File) => {
return await new 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 Error("编码格式不正确,请提交 UTF-8 文件格式"));
}
};
reader.onerror = () => {
reject(new Error("文档內容载入不成功,请查验文档是不是毁坏"));
};
});
};
该方式难题取决于,假如文档十分大,例如好多个G,电脑浏览器看到的內容立即放到运行内存中,fileReader案例会立即开启onerror,抛出去不正确,有时候电脑浏览器会立即奔溃。
大文件计划方案
针对大文件,能够 对文档內容开展取样,对文档开展切成片,这儿应用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 total = 100;
const sampleSize = 1024 * 1024;
const chunkSize = Math.floor(filesize / total);
let start = 0;
let end = sampleSize;
while (total > 1) {
parts.push(file.slice(start, end));
start = chunkSize;
end = chunkSize;
total--;
}
}
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;
}
关注不迷路
扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!
温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
评论0