js判斷文件是否為utf-8編碼的方法
常規(guī)方案
使用FileReader以utf-8格式讀取文件,根據(jù)文件內(nèi)容是否包含亂碼字符�,來判斷文件是否為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("文件內(nèi)容讀取失敗,請檢查文件是否損壞"));
};
});
};
該方法問題在于,如果文件非常大,比如幾個G,瀏覽器讀到的內(nèi)容直接放在內(nèi)存中,fileReader實例會直接觸發(fā)onerror,拋出錯誤,有時瀏覽器會直接崩潰。
大文件方案
對于大文件,可以對文件內(nèi)容進行抽樣,對文件進行切片,這里使用100片。對切出的每片文件再切取前面1kb大小的片段,以string方式讀取。如果1024B可能正好切在某個漢字編碼的中間,導致以string方式讀取時出錯,即首尾可能出現(xiàn)�,被認為是非utf-8片段。這時可以取1kb對應字符串的前半段,再去判斷�是否存在。
上述常數(shù)可以根據(jù)需求進行調(diào)整。
代碼如下:
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(文件內(nèi)容讀取失敗,請檢查文件是否損壞"));
};
});
};
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;
}
到此這篇關(guān)于js判斷文件是否為utf-8編碼的方法的文章就介紹到這了,更多相關(guān)js判斷utf-8內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript使用encodeURI()和decodeURI()獲取字符串值的方法
這篇文章主要介紹了JavaScript使用encodeURI()和decodeURI()獲取字符串值的方法,實例分析了encodeURI()和decodeURI()函數(shù)解析字符串的相關(guān)技巧,需要的朋友可以參考下2015-08-08
Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串
這篇文章主要介紹Javascript將數(shù)字轉(zhuǎn)化成為貨幣格式字符串的方法,通俗易懂,需要的朋友可以參考下。2016-06-06
Javascript實現(xiàn)跨域后臺設(shè)置攔截的方法詳解
這篇文章主要給大家介紹了關(guān)于Javascript實現(xiàn)跨域后臺設(shè)置攔截的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面跟著小編來一起學習學習吧。2017-08-08
原生javascript實現(xiàn)圖片滾動、延時加載功能
這篇文章主要介紹了使用原生javascript實現(xiàn)圖片滾動、延時加載功能,思路與方法均分享給大家,希望對大家能有所幫助。2015-01-01

