最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

js判斷文件是否為utf-8編碼的方法

 更新時間:2021年06月03日 08:35:37   作者:tornoda  
使用FileReader以utf-8格式讀取文件,根據(jù)文件內(nèi)容是否包含亂碼字符,來判斷文件是否為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)文章

最新評論

奉新县| 宾川县| 墨江| 邵阳县| 渭南市| 阿合奇县| 林口县| 石台县| 十堰市| 神农架林区| 镇平县| 庆云县| 兖州市| 宁津县| 福鼎市| 五常市| 乡宁县| 三江| 吐鲁番市| 五家渠市| 大渡口区| 吴川市| 紫金县| 奉贤区| 陵水| 通海县| 尉氏县| 英超| 璧山县| 朝阳区| 理塘县| 大洼县| 镇康县| 遂昌县| 达日县| 进贤县| 金昌市| 绍兴县| 边坝县| 张家港市| 渭南市|