编码揭秘:解构字符%20背后的秘密与百分号编码艺术
前言
提到这个
%20
,想必大家都见过,熟悉一点编码的人,还会知道这玩意就是空格转换而来! 那么我们一起破解, 如何编码而来?
我们今天继续学习前端编码知识, 其他编码文章:
之后再补上
- UTF-16 编码
- UTF-8 编码
前端所需要的基本编码知识体系就基本形成。
更多前端基础进阶知识,可以
- 关注专栏
前端基础进阶
, - 关注公众号
成长的程序世界
, - 进交流群
dirge-cloud
Unicode基础知识
Unicode 只是一个字符集, 其为每个字符提供了一个编号,我们称之为
码点
。
Unicode 可以使用的编码有三种,分别是:
UFT-8
:一种
变长的编码方案
,使用 1~6 个字节来存储。
UTF-16
:对于码点小于
0xFFFF
(65535)的字符,两个字节存储,反之采用 4个字节来存储。
UFT-32
:一种
固定长度的编码方案
,不管字符编号大小,始终使用 4 个字节来存储。
所以UTF-8个UTF-16都属于变长编码方案,而UTF-32属于固定长度编码方案。
固定长度编码方案优点当然是简单啊,缺点嘛,费空间, 这就是为嘛还要有UTF-16和UTF-8。
我们网络传输常用 UTF-8, 而javascript运行时的字符编码是 UTF-16.
%20
怎么来的
我们看看,我们怎么样可以得到这个
%20
:
escape(" ") "%20"
encodeURI(" ") "%20"
encodeURIComponent(" ") "%20"
其是字符的
16进制格式值
, 是百分号编码,之后会细说。
怎么获得这个编码,写一个简单的方法你就懂了
function to16Format(ch){
return '%' + ch.codePointAt(0).toString(16)
}
to16Format(" ") // "%20"
虽然3个方法都能获得同样的值,
很少有人告诉你 esacpe是基于UTF-16,而另外两个是基于 UTF-8, 看个例子:
0-0xFF
码点范围编码结果是一致的,
0xFF
以上,结果就不一样了, 原理我们后面说。
escape("") //%20
encodeURI("") //%20escape("人") // "%u4EBA"
encodeURI("人") // "%E4%BA%BA"
escape("