程序笔记   发布时间:2022-07-20  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了利用js判断文件是否为utf-8编码大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

常规方案

使用 FileReader 以utf-8格式读取文件,根据文件内容是否包含乱码字符 � ,来判断文件是否为utf-8。

如果存在  �,即文件编码非utf-8,反之为utf-8。

代码如下:

const isUtf8 = async (file: FilE) => {
  return await new @H_801_16@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 @H_801_16@Error("编码格式错误,请上传 UTF-8 格式文件"));
      }
    };
    
    reader.onerror = () => {
      reject(new @H_801_16@Error("文件内容读取失败,请检查文件是否损坏"));
    };
  });
};

该方法问题在于,如果文件非常大,比如几个G,浏览器读到的内容直接放在内存中,fileReader实例会直接触发onerror,抛出错误,有时浏览器会直接崩溃。

https://www.98891.com/article-68-1.html

大文件方案

对于大文件,可以对文件内容进行抽样,对文件进行切片,这里使用 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 @R_259_10586@l = 100;
    const sampleSize = 1024 * 1024;
    const chunkSize = Math.floor(filesize / @R_259_10586@l);
    let start = 0;
    let end = sampleSize;
    while (@R_259_10586@l > 1) {
      parts.push(file.slice(start, end));
      start += chunkSize;
      end += chunkSize;
      @R_259_10586@l--;
    }
  }
  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;
}

大佬总结

以上是大佬教程为你收集整理的利用js判断文件是否为utf-8编码全部内容,希望文章能够帮你解决利用js判断文件是否为utf-8编码所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。