转载自海里大佬!

URL编码

URI所允许的字符分作保留与未保留。保留字符是那些具有特殊含义的字符,例如:斜线字符用于URL(或URI)不同部分的分界符;未保留字符没有这些特殊含义。百分号编码把保留字符表示为特殊字符序列。上述情形随URI与URI的不同版本规格会有轻微的变化。

对保留字符的百分号编码

首先需要把该字符的ASCII的值表示为两个16进制的数字,然后在其前面放置转义字符(“%“),置入URI中的相应位置。

对未保留字符的百分号编码

未保留字符不需要百分号编码.

对百分号字符的百分号编码

由于百分号字符(“%”)表示百分号编码字节流的存在, 因此百分号字符应该被编码为3个字节的序列:”%25”,用于URI内部(0x25为%的ascii码)

编码表可以简单的以ASCII码表为准(见下)

URL编码_wiki百科

ASCII编码

ASCII 由电报码发展而来,经过多次更新至今为止共定义了128个字符;其中33个字符无法显示(一些终端提供了扩展,使得这些字符可显示为诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符。控制字符的用途主要是用来操控已经处理过的文字。
可以简单的分为控制字符和可显示字符

用十进制来表示的话,031+127位为控制字符,32126为可显示字符,其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等

ASCII_wiki百科

Unicode码

Unicode是一个编码方案,Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。Unicode 编码共有三种具体实现,分别为utf-8,utf-16,utf-32,其中utf-8占用一到四个字节,utf-16占用二或四个字节,utf-32占用四个字节。

Unicode码扩展自ASCII字元集。Unicode使用全16位元字元集。这使得Unicode能够表示世界上所有的书写语言中可能用於电脑通讯的字元、象形文字和其他符号。

Unicode最初打算作为ASCII的补充,可能的话,最终将代替它。

Unicode码一直在修正扩充,目前已经包含的文字有:阿拉伯字母、亚美尼亚字母、孟加拉文、注音符号、西里尔字母、天城文、格鲁吉亚字母、希腊字母、古吉拉特文、古木基文、谚文、希伯来字母、平假名、卡纳达文、片假名、寮文字、拉丁字母、马拉雅拉姆文、奥里亚文、泰米尔文、泰卢固文、泰文字、欧元符号、对象替换字符、切罗基文,吉兹字母,高棉字母,蒙古字母,缅文,欧甘字母,卢恩字母,僧伽罗文,叙利亚字母,它拿字母,加拿大原住民音节文字、彝文
、部分盲文图案、德瑟雷特字母、哥特字母、古意大利字母、音乐符号、拜占庭音乐符号,中日韩统一表意文字、菲律宾文字布锡文、哈努诺文、他加禄文、塔格巴奴亚文、塞浦路斯音节文字,林布字母,线形文字B,奥斯曼亚字母,萧伯纳字母,德宏傣文,乌加里特字母、六十四卦、布吉文,格拉哥里字母,佉卢文,西双版纳傣文,古波斯文,锡尔赫特文、提非纳文 、古希腊音乐符号、巴厘文,楔形文字,西非书面文字,八思巴文、腓尼基字母、卡利亚文,占婆字母,克耶黎文,绒巴文,利西亚文,吕底亚文,桑塔利文,拉让文,索拉什特拉文,巽他文、瓦伊文、斐斯托斯圆盘,麻将、多米诺骨牌上的符号、阿维斯陀文,巴姆穆文字,埃及象形文字 (加汀纳符号表,涵盖1071个符号),亚拉姆文,巴拉维碑铭体,帕提亚碑铭体,爪哇文,凯提文,老傈僳文,曼尼普尔文,南阿拉伯字母,古突厥文,撒玛利亚字母,老傣文、傣越文。、巴塔克字母,婆罗米文字,曼达字母,纸牌符号,交通标志,地图符号,炼金术符号,颜文字、绘文字、查克马字母,麦罗埃文,麦罗埃象形文字,柏格理苗文,夏拉达文,索拉僧平文字、泰克里文、土耳其里拉符号、5个双向排版符号、巴萨字母,高加索阿尔巴尼亚字母,杜普雷严速记,爱尔巴桑字母,古兰塔文,可吉文,库达瓦迪文,线形文字A,马哈佳尼文,摩尼教字母,门得文字,莫迪字母,默文,纳巴泰字母,古北阿拉伯文,古彼尔姆文,杨松录苗文,帕米拉文字,袍清豪文,诗篇巴列维文,悉昙文字,底罗仆多文,瓦兰齐地文、装饰符号、阿洪姆文,安纳托利亚象形文字,哈坦文,穆尔塔尼文,古匈牙利字母,书写符号、切罗基文小写字母,以及五种绘文字肤色修改字符、阿德拉姆字母,比奇舒奇文,象雄文,尼泊尔纽瓦字母,欧塞奇字母,西夏文、绘字文、札那巴札尔、索永布文字、马萨拉姆贡德文字、女书、变体假名(非标准平假名)、多格拉文、格鲁吉亚文骑士体大写字母、贡贾拉贡德文、哈乃斐罗兴亚文字、望加锡文、梅德法伊德林文、老粟特文、粟特文、埃利迈文、南迪城文、创世纪苗文、文乔文、花剌子模语、迪维西语的岛字母、契丹小字、库尔德语字母的Yezidi体、书写豪萨语用的阿拉伯附加字母、沃洛夫语、其他非洲语言、在巴基斯坦书写印德科语和旁遮普语的补充字符、粤语用的注音符号、共享创意授权符号、七十或八十年代电讯用图符。

Unicode编码系统可分为编码方式和实现方式两个层次。

目前实际应用的统一码版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216(即65536)个字符。基本满足各种语言的使用。
UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。
基本多文种平面的字符的编码为U+hhhh,其中每个h代表一个十六进制数字,与UCS-2编码完全相同。而其对应的4字节UCS-4编码后两个字节一致,前两个字节则所有位均为0。
Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicod转换格式(Unicode Transformation Format,简称为UTF)。

Unicode_wiki百科

base64

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。每6个比特为一个单元,Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据,包括MIME的电子邮件及XML的一些复杂数据。

  • 编码“Man”
文本 M A N
ASCII编码 77 97 110
二进制位 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0
索引 19 22 5 46
Base64编码 T W F u

在此例中,Base64算法将3个字节编码为4个字符。

Base64索引表:

数值 字符 数值 字符 数值 字符
0 A 16 Q 32 g 48 w
1 B 17 R 33 h 49 x
2 C 18 S 34 i 50 y
3 D 19 T 35 j 51 z
4 E 20 U 36 k 52 0
5 F 21 V 37 l 53 1
6 G 22 W 38 m 54 2
7 H 23 X 39 n 55 3
8 I 24 Y 40 o 56 4
9 J 25 Z 41 p 57 5
10 K 26 a 42 q 58 6
11 L 27 b 43 r 59 7
12 M 28 c 44 s 60 8
13 N 29 d 45 t 61 9
14 O 30 e 46 u 62 +
15 P 31 f 47 v 63 /

大致过程:先将文本转为ascii码,再转为8位2进制数,再取其中6位得出对应的十进制数,再通过索引表中转换为字符

如果要编码的字节数不能被3整除,最后会多出1个或2个字节,那么可以使用下面的方法进行处理:先使用0字节值在末尾补足,使其能够被3整除,然后再进行Base64的编码。在编码后的Base64文本后加上一个或两个=号,代表补足的字节数。说,当最后剩余两个八位(待补足)字节(2个byte)时,最后一个6位的Base64字节块有四位是0值,最后附加上两个等号;如果最后剩余一个八位(待补足)字节(1个byte)时,最后一个6位的base字节块有两位是0值,最后附加一个等号。

base64解码

在线解码编码网站

base64_python

想将字符串转编码成base64,要先将字符串转换成二进制数据

url = "https://www.cnblogs.com/songzhixue/"
bytes_url = url.encode("utf-8")
str_url = base64.b64encode(bytes_url) # 被编码的参数必须是二进制数据
print(str_url)

b'aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8='

将base64解码成字符串

import base64
url = "aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vc29uZ3poaXh1ZS8="
str_url = base64.b64decode(url).decode("utf-8")
print(str_url)

'https://www.cnblogs.com/songzhixue/'