欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年06月03日 08:35:37   作者:tornoda  
使用FileReader以u(píng)tf-8格式讀取文件,根據(jù)文件內(nèi)容是否包含亂碼字符,來判斷文件是否為utf-8,本文就詳細(xì)的介紹一下使用,感興趣的小伙伴們可以參考一下

常規(guī)方案

使用FileReader以u(píng)tf-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("編碼格式錯(cuò)誤,請(qǐng)上傳 UTF-8 格式文件"));
      }
    };
    
    reader.onerror = () => {
      reject(new Error("文件內(nèi)容讀取失敗,請(qǐng)檢查文件是否損壞"));
    };
  });
};

該方法問題在于,如果文件非常大,比如幾個(gè)G,瀏覽器讀到的內(nèi)容直接放在內(nèi)存中,fileReader實(shí)例會(huì)直接觸發(fā)onerror,拋出錯(cuò)誤,有時(shí)瀏覽器會(huì)直接崩潰。

大文件方案

對(duì)于大文件,可以對(duì)文件內(nèi)容進(jìn)行抽樣,對(duì)文件進(jìn)行切片,這里使用100片。對(duì)切出的每片文件再切取前面1kb大小的片段,以string方式讀取。如果1024B可能正好切在某個(gè)漢字編碼的中間,導(dǎo)致以string方式讀取時(shí)出錯(cuò),即首尾可能出現(xiàn)�,被認(rèn)為是非utf-8片段。這時(shí)可以取1kb對(duì)應(yīng)字符串的前半段,再去判斷�是否存在。

上述常數(shù)可以根據(jù)需求進(jìn)行調(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(編碼格式錯(cuò)誤,請(qǐng)上傳 UTF-8 格式文件"));
      }
    };

    fileReader.onerror = () => {
      reject(new Error(文件內(nèi)容讀取失敗,請(qǐng)檢查文件是否損壞"));
    };
  });
};

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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js中判斷兩個(gè)數(shù)組對(duì)象是否完全相等

    js中判斷兩個(gè)數(shù)組對(duì)象是否完全相等

    這篇文章主要介紹了js中判斷兩個(gè)數(shù)組對(duì)象是否完全相等方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • 微信小程序 websocket 實(shí)現(xiàn)SpringMVC+Spring+Mybatis

    微信小程序 websocket 實(shí)現(xiàn)SpringMVC+Spring+Mybatis

    這篇文章主要介紹了 微信小程序websocket實(shí)現(xiàn)SpringMVC+Spring+Mybatis的相關(guān)資料,這里提供實(shí)現(xiàn)思路及實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2017-08-08
  • js生成隨機(jī)數(shù)方法和實(shí)例

    js生成隨機(jī)數(shù)方法和實(shí)例

    這篇文章主要介紹了js生成隨機(jī)數(shù)方法和實(shí)例,由js生成一切隨機(jī)數(shù)的基礎(chǔ)都是Math.random(),有興趣的可以了解一下。
    2017-01-01
  • JavaScript?中的單例內(nèi)置對(duì)象Global?與?Math

    JavaScript?中的單例內(nèi)置對(duì)象Global?與?Math

    這篇文章主要介紹了JavaScript?中的單例內(nèi)置對(duì)象Global與Math,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • 微信小程序?qū)崿F(xiàn)的貪吃蛇游戲【附源碼下載】

    微信小程序?qū)崿F(xiàn)的貪吃蛇游戲【附源碼下載】

    這篇文章主要介紹了微信小程序?qū)崿F(xiàn)的貪吃蛇游戲,結(jié)合實(shí)例形式分析了微信小程序?qū)崿F(xiàn)貪吃蛇游戲功能的相關(guān)界面布局與代碼邏輯操作技巧,并附帶源碼供讀者下載參考,需要的朋友可以參考下
    2018-01-01
  • JavaScript 繼承詳解 第一篇

    JavaScript 繼承詳解 第一篇

    幾乎每個(gè)開發(fā)人員都有面向?qū)ο笳Z言(比如C++、C#、Java)的開發(fā)經(jīng)驗(yàn)。 在傳統(tǒng)面向?qū)ο蟮恼Z言中,有兩個(gè)非常重要的概念 - 類和實(shí)例。
    2009-08-08
  • JS中的函數(shù)與對(duì)象的創(chuàng)建方式

    JS中的函數(shù)與對(duì)象的創(chuàng)建方式

    這篇文章主要介紹了JS中的函數(shù)與對(duì)象的創(chuàng)建方式,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • 原生js實(shí)現(xiàn)分頁效果

    原生js實(shí)現(xiàn)分頁效果

    這篇文章主要為大家詳細(xì)介紹了原生js實(shí)現(xiàn)分頁效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • JavaScript查看代碼運(yùn)行效率console.time()與console.timeEnd()用法

    JavaScript查看代碼運(yùn)行效率console.time()與console.timeEnd()用法

    今天小編就為大家分享一篇關(guān)于JavaScript查看代碼運(yùn)行效率console.time()與console.timeEnd()用法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • BootStrap實(shí)現(xiàn)輪播圖效果(收藏)

    BootStrap實(shí)現(xiàn)輪播圖效果(收藏)

    這篇文章主要介紹了BootStrap實(shí)現(xiàn)輪播圖效果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12

最新評(píng)論