本文主要介绍FileReader对象,以及如何分割utf-8编码的二进制序列

FileReader对象

FileReader对象通过异步读取文件,可以通过readAsText读取文本内容,readAsDataURL可以把文件生成本地的资源定位符,例如可以通过src展示选择的图片文件,readAsBinaryString和readAsArrayBuffer是把文件以二进制展示,一个是字符串,一个是对象,可以通过slice操作,本身无法遍历。

简单的文件读取

如果只是简单的读取整个文件也用不到分割文件,以下代码就可以实现

// An highlighted block
var files=event.target.files;//获取文件对象,通过input[type='file']的事件
var reader=new FileReader();//新建fileReader实例
reader.readAsText(files[0],'UTF-8');
reader.onload=function(){console.log(reader.result);}

但是这种方式一次性读取文件很慢,所以一般把文件用slice切片读取
切片的话就会有问题,位置不对就会无法解码出现如下问题

二进制码的生成

想要获取Unicode码需要把文件转化为二进制可以通过以下代码实现

Array.prototype.slice.call(new Uint8Array(buffer)).
map(i=>"00000000".substring(i.toString(2).length)+i.toString(2))
//这里的buffer是通过readAsArrayBuffer方法获取的result
//然后通过slice转为数组,再通过toString转化为二进制字符,发现有的字符转化后
//不足8位,需要高位补0

改变成的二进制信息大概长成这样

UTF-8编码规范和分割的思路

百度到utf-8编码如下,发现是一种变长码。
1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。
如表:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
按照它的一般规律,以10开头的都是非分割码,而其它的都是分割码
那么分割的核心就是找非10码
附上主要代码,对开头和结尾不是正常的都有处理,要记住文件读取是异步的,不然会出现问题:

getFileObj(event){//onchange事件获取fileconsole.log(event);this.files=event.target.files;this.calPageSize().then(res=>{this.showContent();})},prevPage(){//前一页this.pageNum--;this.pageNum<0 && (this.pageNum=0);this.calPageSize().then(res=>{this.showContent();})},nextPage(){//下一页this.pageNum++;this.calPageSize().then(res=>{this.showContent();})},showContent(){//读取文件if(this.files.length===0){return this.$message.info("请选择文件");}let reader=new FileReader(),that=this;reader.readAsText(this.files[0].slice(this.start,this.start+this.pageSize),'UTF-8');reader.onload=function(){that.content=reader.result;}},calPageSize(){//判断开始结束的指针位置let reader=new FileReader(),that=this,preindex=0;that.start=that.pageNum*that.MaxPage;return new Promise((reslove,reject)=>{reader.readAsArrayBuffer(that.files[0].slice(that.start,that.start+that.MaxPage));reader.onload=function(){let binaryArr=that.arrayBufferToString(reader.result);if(binaryArr[0].slice(0,2)==='10'&&that.start-6>=0){//如果前面不是标准开头reader.readAsArrayBuffer(that.files[0].slice(that.start-6,that.start));//最长的编码为6个字节reader.onload=function(){let exBinaryArr=that.arrayBufferToString(reader.result);preindex=that.lastIndex(exBinaryArr,/^(?!10).*/);//查找标准开头preindex!==-1 && (that.start=that.start-(6-preindex));//找到了正确的起始位置//console.log(exBinaryArr,preindex,that.start);tail();}}else{tail();   }function tail(){//尾部多余部分处理let tailindex=that.lastIndex(binaryArr,/^(?!10).*/);//尾部可能是正常结束let str=/^(1*)0.*/g.exec(binaryArr[tailindex])[1];if(str.length+tailindex===binaryArr.length){tailindex=that.MaxPage;}that.pageSize=preindex>0?tailindex+(6-preindex):tailindex;console.log(binaryArr,binaryArr[tailindex],str.length);reslove(true);} } })},arrayBufferToString(buffer){return Array.prototype.slice.call(new Uint8Array(buffer)).map(i=>"00000000".substring(i.toString(2).length)+i.toString(2))},lastIndex(arr,reg){//正则匹配for(let i=arr.length-1;i>0;i--){if(reg.test(arr[i])){return i;}}return -1;}

本人水平有限,如有问题,还望指教

原生JS实现电子书阅读器相关推荐

  1. 使用vuejs+epubjs实现电子书阅读器的基本功能

    这是我第一次写博客,有点紧张,新手还不太会操作,如果不合理的地方希望大佬指点 谢谢.下面是项目需要,然后我在网上学习的如何使用epubjs制作简单阅读器的大体过程(网上有个老师讲的感觉还是不错的,他使 ...

  2. 淡黄色电子书阅读器网站模板

    简介: 淡黄色电子书阅读器网站模板 网盘下载地址: http://kekewangLuo.cc/54nxHefsgCO0 图片:

  3. 安卓电子书格式_读出我的潮流!——全新焕彩Kindle Paperwhite亚马逊电子书阅读器...

    阅读,原本应该是件简单而快乐的事情,纸质书拿在手上虽然有质感,但是越厚的书越重.而且爱书之人,是不能接受手上的书出现任何破损的,带在身上其实也是一种负担.电子书阅读器就能完美解决这些问题. 电子书阅读 ...

  4. 新一代亚马逊电子书阅读器Kindle Paperwhite全球同步上市

    - 全新的纯平设计,配备300ppi超清电子墨水屏,还原纸书阅读体验- 更为轻薄的机身设计,令单手握持更为舒适- 首款防水设计的Kindle Paperwhite,可在更多场景安享阅读 北京2018年 ...

  5. office电子书_掌阅推出首款彩屏电子书阅读器,用它看漫画体验到底如何?

    它作为传统电子书阅读器的延伸,在保留护眼.省电等特性的基础下,还可以显示彩色内容. 从 1996 年诞生于麻省理工实验室起,电子墨水屏技术已经发展了 20 多年,不过它的变化好像一直很少,最常见的应用 ...

  6. 有哪些能支持epub、txt格式的电子书阅读器?能在安卓手机上用的?

    在手机上看书有许多方便之处,随着智能手机的硬件功能越来越发达,无论大学生还是工作族每天与手机端网络资源相接触已经成为了我们生活的常态.可是不得不说手机端打开资源的方式又常常会令我们头痛,那么如何能够又 ...

  7. python微信小程序 java电子书阅读器系统uniapp

    功能介绍 将系统权限按管理员和用户这两类涉及用户划分. (a) 管理员:管理员使用本系统涉到的功能主要有:个人中心.用户管理.类型管理.书城管理.管理员管理.系统管理等功能. (b)用户进入系统前台可 ...

  8. 基于Core Text实现的TXT电子书阅读器

    本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...

  9. 有哪些能支持epub、txt格式的电子书阅读器?能在MAC上用的?

    在电脑上看书有许多方便之处,无论是使用键盘记笔记.或者是大屏幕处理网络与工作资源.确实,无论大学生还是工作族每天与电脑端网络资源相接触已经成为了我们生活的常态.可是不得不说Mac端打开资源的方式又常常 ...

最新文章

  1. qtp9.2测试java_QTP的使用举例说明
  2. golang 绘图库_golang在图片上绘制中文不乱码的方法
  3. http在链接中加入用户名_爬虫基础——HTTP基本原理
  4. 转 carrer 之感
  5. LeetCode 1185. 一周中的第几天
  6. NI Vision for LabVIEW 基础(一):NI Vision 简介
  7. 项目内出现广告位引争议,开源如何持续健康运营?
  8. 程序员疫苗:代码注入
  9. window 和 linux 环境下杀死tomcat进程——也可以解决其他端口被占用的问题
  10. asp.net设置元素css的属性
  11. 回顾2020的爷青结:有哪些记忆里的应用正在消逝!
  12. 分布式系统的基本特征
  13. DELL披露MacBook Pro杀手
  14. 科大讯飞实习 第七周日记
  15. 基础会计学习笔记4 会计核算基本方法(会计工作的主要内容)
  16. [Java8新特性]Collectors源码阅读-2 reducing,maxBy,summingInt等
  17. Pycharm安装、使用的一些操作
  18. 托福高频真词List17 // 附托福TPO阅读真题
  19. springboot+nodejs+vue教师备课系统网站
  20. 金沙艺廊于澳门四季名荟正式开幕;招商维京游轮深耕“文游”助力中国旅游业高质量发展 | 全球旅报...

热门文章

  1. 南京大学MSE软件工程考研分享经历吐血整理
  2. linux终端链接网络,Ubuntu通过命令行设置无线网络连接
  3. Mac上的ps插件安装教程:苹果电脑ps插件怎么安装
  4. UVM入门与进阶学习笔11——TLM通信(3)
  5. 硬件知识--短路保护电路
  6. WordPress百度快速收录 API 提交代码
  7. 网站内页关键词与描述设置方法
  8. wps文字上怎么做流程图_wps文字如何绘制流程图图文教程
  9. 企业人事工资管理系统(源码+数据库+三层架构)
  10. M.2-MXPG2D80-240G固态硬盘SM2256AB主控量产过程