吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2630|回复: 5
收起左侧

[Java 原创] 【JavaScript】"重复造轮子"-文本的Unicode编码转UTF-8编码

[复制链接]
15774211127 发表于 2019-9-20 18:06
本帖最后由 15774211127 于 2019-9-20 18:07 编辑

我来带大家重复造轮子了!!!
由于刚毕业工作压力大工资少,所以想通过学习提升下自己,于是就开启了各种脑洞模式
写了很多看似没有意义的东西,但是在写这些东西的同时确实学到了很多,所以就想和大家分享下(其实是上次发帖被加精后有点飘了)。
1.Unicode编码
  前端在做数据回传时需要将数据加密会经常使用到UTF-8,但是js的charCodeAt命令取到的是Unicode编码
  

charCodeAt

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

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逻辑

处理UTF-8转Unicode逻辑

  6.判断字节长度调用不同处理方式
  

UTF-8编码转Unicode

UTF-8编码转Unicode

  7.处理逻辑
    查找二进制数据的第一个0,因这个数据位的前面数据位数表示字节长度
    将二进制数据每8位分割
    计算起始标识位占用的字节长度(理论上不会超过1字节)
    循环数组,判断不是起始标识位字节部分直接取后六位数据位
    然后直接将数组连接成一个字符串,在去除起始标识位
  

判断字节长度调用不同处理方式

判断字节长度调用不同处理方式

  8.由于写这个是为了给base64编码使用(后期会写base64的,欢迎关注收藏),所以没有将最后的数据转成数字格式,而是一组二进制字符串,大家可以根据需求修改源码
  9.源码
   UTF-8.js.zip (2.64 KB, 下载次数: 15)

免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
yixiqiao + 1 我很赞同!
苏紫方璇 + 3 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

God_Fire 发表于 2019-9-20 18:17
感谢楼主分享,这个必须膜拜一下。。。
 楼主| 15774211127 发表于 2019-9-20 18:37
 楼主| 15774211127 发表于 2019-9-25 09:27
DD924 发表于 2019-9-25 23:04
可以哟 支持一下
 楼主| 15774211127 发表于 2019-9-25 23:14
DD924 发表于 2019-9-25 23:04
可以哟 支持一下

谢谢你的支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 15:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表