判断文件是否为爱的语言。

摘要

用JavaScript判断文档是否为UTF-8编码,就像是在寻找真爱一样,需要仔细观察文档内容中是否有错码标识符�。如果有,那么这份文档就不是UTF-8编码,否则就是。

正文

运用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;
}

关注不迷路

扫码下方二维码,关注宇凡盒子公众号,免费获取最新技术内幕!

温馨提示:如果您访问和下载本站资源,表示您已同意只将下载文件用于研究、学习而非其他用途。
文章版权声明 1、本网站名称:宇凡盒子
2、本站文章未经许可,禁止转载!
3、如果文章内容介绍中无特别注明,本网站压缩包解压需要密码统一是:yufanbox.com
4、本站仅供资源信息交流学习,不保证资源的可用及完整性,不提供安装使用及技术服务。点此了解
5、如果您发现本站分享的资源侵犯了您的权益,请及时通知我们,我们会在接到通知后及时处理!提交入口
0

评论0

请先

站点公告

🚀 【宇凡盒子】全网资源库转储中心

👉 注册即送VIP权限👈

👻 全站资源免费下载✅,欢迎注册!

记得 【收藏】+【关注】 谢谢!~~~

立即注册
没有账号?注册  忘记密码?

社交账号快速登录