论编码重要性(二):你所不了解的编码解码技术

前言

在我的工作中,使用爬虫过程中常常会遇到各种各样的编码解码技术,对于网站返回的响应内容,常常需要一眼就要知道该网站用的什么编码技术?需要用什么解码技术进行解码?请求体内容使用了哪种编码技术?本篇是我了解编码系列的后续,主要内容讲述爬虫工作中常见的编码技术。

常见的编码技术

Unicode 编码

Unicode 在《论编码重要性(一):你所不了解的字符编码》已经进行了详细说明,此处不再进行说明。

以 “Unicode 编码” 为例,说明 Unicode 编码后的内容形式。

1
2
3
4
5
// 原文
Unicode 编码

// Unicode 编码后
\u0055\u006e\u0069\u0063\u006f\u0064\u0065\u0020\u7f16\u7801

UTF-8 编码

UTF-8 在《论编码重要性(一):你所不了解的字符编码》已经进行了详细说明,此处不再进行说明。

以 “UTF-8 编码” 为例,说明 UTF-8 编码后的内容形式。

1
2
3
4
5
// 原文
UTF-8 编码

// UTF-8 编码后
UTF-8 编码

UrlEncode 编码

Url 编码通常也被称为百分号编码(Url Encoding,also known as percent-encoding),是因为它的编码方式非常简单,使用 % 百分号加上两位的字符——0123456789ABCDEF——代表一个字节的十六进制形式。Url 编码默认使用的字符集是 US-ASCII。

对于非 ASCII 字符,需要使用 ASCII 字符集的超集进行编码得到相应的字节,然后对每个字节执行百分号编码。对于 Unicode 字符,RFC 文档建议使用 utf-8 对其进行编码得到相应的字节,然后对每个字节执行百分号编码。如 “中文” 使用 UTF-8 字符集得到的字节为 0xE4 0xB8 0xAD 0xE6 0x96 0x87,经过 Url 编码之后得到 “%E4%B8%AD%E6%96%87”。

例如,Url 参数字符串中使用 key=value 键值对这样的形式来传参,键值对之间以 & 符号分隔,如 / s?q=abc& ie=utf-8。如果你的 value 字符串中包含了 = 或者 &,那么势必会造成接收 Url 的服务器解析错误,因此必须将引起歧义的 & 和 = 符号进行转义,也就是对其进行编码。

1
2
3
4
5
6
7
// 原文
http://www.baidu.com/s?ie=utf-8&f=8&tn=baidu&wd = 临时邮箱

// UrlEncode 编码后
http://www.baidu.com/s?ie=utf-8&f=8&tn=baidu&wd=%C1%D9%CA%B1%D3%CA%CF%E4

// 例如 a 在 US-ASCII 码中对应的字节是 0x61,那么 Url 编码之后得到的就是 %61,我们在地址栏上输入 http://g.cn/search?q=%61%62%63,实际上就等同于在 google 上搜索 abc 了。又如 @符号在 ASCII 字符集中对应的字节为 0x40,经过 Url 编码之后得到的是 %40

Base64 编码

Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一,Base64 就是一种基于 64 个可打印字符来表示二进制数据的方法。这 64 个可打印字符 a-z,A-Z,0-9 就占 62 字符,剩下 2 个字符不同系统可能使用不同,经常是:“+/”。

1
2
3
4
5
// 原文
Base64 是网络上最常见的用于传输 8Bit 字节码的编码方式之一

// Base64 编码
QmFzZTY0ysfN+MLnyc/X7rOjvPu1xNPD09q0q8rkOEJpdNfWvdrC67XEseDC67e9yr3WrtK7

Java 代码实现:

1
2
3
4
5
6
7
8
9
import java.util.Base64;
对于标准的 Base64
加密为字符串使用
Base64.getEncoder().encodeToString();
加密为字节数组使用
Base64.getEncoder().encode();
解密使用
Base64.getDecoder().decode();
对于 URL 安全或 MIMEBase64,只需将上述 getEncoder()getDecoder() 更换为 getUrlEncoder()getUrlDecoder() 或 getMimeEncoder() 和 getMimeDecoder() 即可。

Hex 编码

Hex 编码就是把一个 8 位的字节数据用两个十六进制数展示出来,编码时,将 8 位二进制码重新分组成两个 4 位的字节,其中一个字节的低 4 位是原字节的高四位,另一个字节的低 4 位是原数据的低 4 位,高 4 位都补 0,然后输出这两个字节对应十六进制数字作为编码。
比如 ASCII 码 A 的 Hex 编码过程为:

1
2
3
4
5
ASCII 码:A (65)
二进制码:0100_0001
重新分组:0000_0100 0000_0001
十六进制: 4 1
Hex 编码:41

参考博文

[1].Web 开发须知:URL 编码与解码
[2].1-Hex 编码


论编码重要性系列


谢谢你长得那么好看,还打赏我!😘
0%