转载自海里大佬!

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/'