运用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条)

刀客源码 游客评论