Skip to content

Latest commit

 

History

History
120 lines (111 loc) · 3.42 KB

dev.md

File metadata and controls

120 lines (111 loc) · 3.42 KB

目录说明

├── browser-source       生成浏览器版本的源文件
├── data                 GBK相关资源文件
├── datazip              压缩编码表相关的东西都在这里
├── dist
├── gulpfile.js          gulp配制
├── index.js             node版入口
├── src                  
└── test                 测试

压缩过程

先拿按 GBK 的有效码位顺序拿到对应 Unicode

码区参考

GBK的编码范围
范围 第1字节 第2字节 编码数 字数
水准GBK/1 A1A9 A1FE 846 717
水准GBK/2 B0F7 A1FE 6,768 6,763
水准GBK/3 81A0 40FE (7F除外) 6,080 6,080
水准GBK/4 AAFE 40A0 (7F除外) 8,160 8,160
水准GBK/5 A8A9 40A0 (7F除外) 192 166
用户定义 AAAF A1FE 564
用户定义 F8FE A1FE 658
用户定义 A1A7 40A0 (7F除外) 672
合计: 23,940 21,886

最终拿到一个 GBK 码位顺序的 Unicode 数组 (不包含扩展码位)

转码

将数组转为 x进制 3位编码, 空码用 '#' 代替

(x 范围(40 - 89)) 小于40进制时,编码可能超过3位

压缩

  1. 数组各项合并成一个字符串.
  2. 连续空码位压缩: 连续8个空码位 ######## => #5$
  3. 连续前位字符相同压缩(分隔符为空格): abb abc abd abe abf => ab!bcdef
  4. 在上一位基础上进一步压缩: ab!bcdef => ab!b%f

压缩时占用了6个符号做特殊用途分别是:

  • # 0x23 空码
  • $ 0x24 连续空码结束标志
  • ! 0x21 前两位相同标志
  • % 0x25 第三位递增标志
  • 0x20 前两位字符相同结束标志
  • " 0x22 javascript占用(用 \"\' 造成压缩效果变差).

ASCII 可见字符是 0x20 - 0x7e 所以多进制转换可用字符为0x26 - 0x7e 共89个字符, 所以最大进制为89进制

构建过程

  1. ./datazip 执行后会拿到
    • zipData 压缩后的字符串
    • unZipFn 解压函数的源码 ()
    • decodeFn 压缩转x进制的反函数的源码
  2. 替换 ./browser-source/*.js 中的占位符
  3. 输出