字符编码 #
有的字符在一些环境中是不能显示或使用的,
比如 &
, =
等字符在 URL 被保留为特殊作用的字符;
比如描述一张图片,而图片中的二进制码如果转成对应的字符的话,会有很多不可见字符和控制符(如换行、回车之类),
这时就需要对进行编码。
各种编码的特征 #
- Base 编码
- Base64
- 组成字符:
A-Z、a-z、0-9、+、/
- 末尾一般补 0-2 个
=
(可以不补=
)
- 组成字符:
- Base32
- 组成字符:
A-Z、2-7
- 末尾一般补 0-6 个
=
(可以不补=
)
- 组成字符:
- Base16
- 组成字符:
0-9、A-F
- 末尾没有
=
- 组成字符:
- Base64
Base 编码 #
参考:rfc4648
Base 系列的就是用来将字节编码为 ASCII 中的可见字符的。
在 URL 中使用时必须去掉 “=
” 符号
Base64 #
Base64 编码是使用 64 个可打印 ASCII 字符(A-Z、a-z、0-9、+、/
)将任意字节序列数据编码成 ASCII 字符串,另有 “=
” 符号用作后缀用途。
Base64 将输入字符串按字节切分,取得每个字节对应的二进制值(若不足 8 比特则高位补 0),
然后将这些二进制数值串联起来,再按照 6 比特一组进行切分(因为 2^6=64
),最后一组若不足 6 比特则末尾补 0。
由于二进制数据是按照 8 比特一组进行传输,因此 Base64 按照 6 比特一组切分的二进制数据必须是 24 比特的倍数(6 和 8 的最小公倍数),
就是 3 个字节。
若原字节序列数据长度不是 3 的倍数时且剩下 1 个输入数据,则在编码结果后加 2 个 =
;若剩下 2 个输入数据,则在编码结果后加 1 个 =。
数据量扩大了 1/3
。
Base32 #
Base16 编码会将字节切为 5 个一组,所以此编码后会用到 32 个字符(A-Z、2-7
),
数据量扩大了 3/5
(文本一长,最后填充的 0 和 = 的数据量差不多就可忽略不计了)。
需要凑够 8 个字符
00000001 00000011 00000111 00001111 00011111
=>
00000 00100 00001 10000 01110 00011 11000 11111
00000001 00000011 00000111 00001111 00011111 11111111
=>
00000 00100 00001 10000 01110 00011 11000 11111
11111 11100 = = = = = =
// 最后不足 5 字节的重组后先在右边充 0,编码完成后再右边充 =
为什么后面要补 =
#
由于数据的二进制传输是按照 8 比特一组进行(即一个字节), 因此 Base32 按 5 比特切分的二进制数据必须是 40 比特的倍数(5 和 8 的最小公倍数),就是 5 字节。
填充 “=
” 符号的作用是方便一些程序的标准化运行,大多数情况下不添加也无关紧要,
而且,在 URL 中使用时必须去掉 “=
” 符号。
优点 #
与 Base64 相比,Base32 具有许多优点:
- 适合不区分大小写的文件系统,更利于人类口语交流或记忆。
- 结果可以用作文件名,因为它不包含路径分隔符 “
/
” 等符号。 - 排除了视觉上容易混淆的字符,因此可以准确的人工录入。
(例如,RFC4648 符号集忽略了数字 “
1
”、“8
” 和 “0
”,因为它们可能与字母 “I
”,“B
” 和 “O
” 混淆)。 - 排除填充符号 “
=
” 的结果可以包含在 URL 中,而不编码任何字符。
Base32 也比 Base16 有优势:
- Base32 比 Base16 占用的空间更小。(1000 比特数据 Base32 需要 200 个字符,而 Base16 则为 250 个字符)
缺点 #
Base32 比 Base64 多占用大约 20%
的空间 —— (8/5 - (8/6)) / (8/6)
。
因为 Base32 使用 8 个 ASCII 字符去编码原数据中的 5 个字节数据, 而 Base64 是使用 4 个 ASCII 字符去编码原数据中的 3 个字节数据。
Base16 #
Base16 编码是一个标准的十六进制字符串(注意是字符串而不是数值),更易被人类和计算机使用,
因为它并不包含任何控制字符,以及 Base64 和 Base32 中的 =
符号。
Base16 编码会将字节切为 4 个一组,所以此编码后会用到 16 个字符(0-9、A-F
),数据会扩大 2 倍
URL 编码(百分号编码) #
- 网址路径的编码,用的是
utf-8 编码
- 查询字符串的编码,用的是操作系统的默认编码
- GET 和 POST 方法的编码,用的是网页的编码
- Ajax 调用中,IE 总是采用 GB2312 编码(操作系统的默认编码),而 Firefox 总是采用 utf-8 编码
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。