字符编码

字符编码 #

有的字符在一些环境中是不能显示或使用的, 比如 &, = 等字符在 URL 被保留为特殊作用的字符; 比如描述一张图片,而图片中的二进制码如果转成对应的字符的话,会有很多不可见字符和控制符(如换行、回车之类), 这时就需要对进行编码。

各种编码的特征 #

  • Base 编码
    • Base64
      • 组成字符:A-Z、a-z、0-9、+、/
      • 末尾一般补 0-2 个 =(可以不补 =
    • Base32
      • 组成字符:A-Z、2-7
      • 末尾一般补 0-6 个 =(可以不补 =
    • Base16
      • 组成字符:0-9、A-F
      • 末尾没有 =

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 编码

参考:



本文访问量

本站总访问量

本站总访客数