创建jsp时如何默认生成的是utf-8(js判断文件是否为utf-8编码的方法)
类别:编程学习 浏览量:2273
时间:2022-01-24 00:46:32 创建jsp时如何默认生成的是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; }
到此这篇关于js判断文件是否为utf-8编码的方法的文章就介绍到这了,更多相关js判断utf-8内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
您可能感兴趣
- JS中instanceof与typeof的区别有哪些
- js中toFixed() 的使用
- vue引用js库报错(Vue插件报错:Vue.js is detected on this page.问题解决)
- js的showModalDialog的用法
- extjs中treegrid
- JS文件智能提示另一个JS文件中的成员
- python获取json结果保存文本(Python JSON格式数据的提取和保存的实现)
- 用js编写tab栏切换(JavaScript实现简易tab栏切换内容栏)
- vue实现图片上传数据库(vue.js根据图片url进行图片下载)
- ExtJs 中Viewport 的使用
- python的decode函数在哪个模块(python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决)
- extjs 日期控件
- js和php加密(RSA实现JS前端加密与PHP后端解密功能示例)
- js中arguments的用法
- JavaScriptSerializer对Json对象的序列化和反序列化
- vuejs全家桶入门教程交流(Vue全家桶入门基础教程)
- 二次创业 的富士胶片,在进博会上首次展示完成转型后的全线医疗产品(二次创业的富士胶片)
- 富士胶片 中国 我们对上海的信心没有任何改变(富士胶片中国)
- 赢麻了 富士公布2021年度财报 营利同比增长240(富士公布2021年度财报)
- 医事文化谈屑 | 古人的名 字 号(医事文化谈屑古人的名)
- ()
- 网友很惭愧,自己写了很多年的字,到头来还不如一名小学生写的好(自己写了很多年的字)
热门推荐
- js的replace的用法
- js脚本语言原理(实例说明js脚本语言和php脚本语言的区别)
- mysql快速添加百万条记录(Mysql快速插入千万条数据的实战教程)
- mac的mysql连接问题如何解决(MAC 中mysql密码忘记解决办法)
- vuex存取修改数据流程(vuex数据持久化的两种实现方案)
- margin auto 实现居中,与text-align:center的区别
- laravel 队列导入数据(laravel框架查询数据集转为数组的两种方法)
- 用python3.5.3实现邮件收发(Python使用POP3和SMTP协议收发邮件的示例代码)
- python起源详解(Python发展简史 Python来历)
- vue浏览pdf文件(如何在vue中使用pdfjs预览pdf文件)