好友
阅读权限25
听众
最后登录1970-1-1
|
本帖最后由 15774211127 于 2019-9-20 18:07 编辑
我来带大家重复造轮子了!!!
由于刚毕业工作压力大工资少,所以想通过学习提升下自己,于是就开启了各种脑洞模式
写了很多看似没有意义的东西,但是在写这些东西的同时确实学到了很多,所以就想和大家分享下(其实是上次发帖被加精后有点飘了)。
1.Unicode编码
前端在做数据回传时需要将数据加密会经常使用到UTF-8,但是js的charCodeAt命令取到的是Unicode编码
charCodeAt
首先Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。
2.UTF-8
UTF-8可变长度字符编码是Unicode的一个实现,它规定了二进制代码应该如何存储(还有UTF-16,UTF-32),使用1~4字节为每个字符编码。
存储规则:
1.对于单字节字符(不足8位的字符)
最高位固定为0,其余低7位存储Unicode编码。
2.对于多字节字符(N个字节(这里指UTF-8编码后的字节))
第一字节的高N位固定为1,第N+1位为0(起始标识,代表一个字符开始)。其余字节的高2位固定为10(连接标识,代表该字节是属于之前的字节的不能单独使用)。其他未使用的位置为数据位,用来存储Unicode编码(从低位到高位填充,高位部分不足时填充0)。
例如:"严"的Unicode是(4E25)H(01001110 00100101)B
UTF-8编码是(11100100 10111000 10100101)B(红色部分是标识位,黑色部分是Unicode编码)
3.引用:Unicode utf8等编码类型的原理
3.思路分析
1.首先我们得拿到字符的Unicode编码
2.计算出标识位数量
1.由于我们是Unicode编码转为UTF-8,我们现在是不知道UTF-8编码后的字节位数的,所以我们目前无法知道标识位的数量,导致无法直接将Unicode编码填充进去。
1.对于不足8位的字符直接将不足8位的部分填充0.
2.对于大于等于8位的字符
根据UTF-8除第一字节外的其他字节的高两位固定为10,我们可以先将Unicode编码按6位(从后往前分,不足填充0)分组:例:(01001110 00100101)B分组成(000100 111000 100101)B
将分组后的编码除去第一组外的高两位填充10,得到(000100 10111000 10100101)B
将第一组填充0补满8位得到(00000100 10111000 10100101)B
填充后得到三个字节,所以我们将第一组的高3位修改为1,第3+1位修改为0(不能修改数据位)得到(11100100 10111000 10100101)B
由于第一字节的标识位是不固定的,填充标识位后可能导致位数溢出,所以需要特别处理
比如:(1111 11111111)B<--这是乱写的
分组:(111111 111111)B
填充10标识位:(111111 10111111)B
处理第一字节标识位:(1 10111111 10111111)B
可以看到由于溢出导致变成3个字节了,而且不符合UTF-8格式
4.编码实现
1.模块化模版
模块化
2.Unicode编码成UTF-8
Unicode编码成UTF-8
3.判断字节长度调用不同处理方式
String.apdStart()是ES6填充文本的方法
unicode2utf8_1、unicode2utf8_2、unicode2utf8_3是处理多字节文本,效果相同,只是使用了不同的处理逻辑
字节长度判断
4.处理逻辑(unicode2utf8_2)
第一个for循环是将二进制数据从后往前每6个一组分割
然后紧跟着计算第一字节标识位的数量,
生成数据位文本并且要计算标识位插入后是否有溢出,如果溢出则增加一个字节并重新计算标识位
将标识位插入数组并且返回
模拟内存地址填充数据
5.UTF-8二进制数据转Unicode编码
接收一个数组循环数据交给处理逻辑,并将处理逻辑返回的数据通过String.fromCharCode()方法转回Unicode;
处理UTF-8转Unicode逻辑
6.判断字节长度调用不同处理方式
UTF-8编码转Unicode
7.处理逻辑
查找二进制数据的第一个0,因这个数据位的前面数据位数表示字节长度
将二进制数据每8位分割
计算起始标识位占用的字节长度(理论上不会超过1字节)
循环数组,判断不是起始标识位字节部分直接取后六位数据位
然后直接将数组连接成一个字符串,在去除起始标识位
判断字节长度调用不同处理方式
8.由于写这个是为了给base64编码使用(后期会写base64的,欢迎关注收藏),所以没有将最后的数据转成数字格式,而是一组二进制字符串,大家可以根据需求修改源码
9.源码
UTF-8.js.zip
(2.64 KB, 下载次数: 15)
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|