转载自海里大佬!
URL编码
URI所允许的字符分作保留与未保留。保留字符是那些具有特殊含义的字符,例如:斜线字符用于URL(或URI)不同部分的分界符;未保留字符没有这些特殊含义。百分号编码把保留字符表示为特殊字符序列。上述情形随URI与URI的不同版本规格会有轻微的变化。
对保留字符的百分号编码
首先需要把该字符的ASCII的值表示为两个16进制的数字,然后在其前面放置转义字符(“%
“),置入URI中的相应位置。
对未保留字符的百分号编码
未保留字符不需要百分号编码.
对百分号字符的百分号编码
由于百分号字符(“%”)表示百分号编码字节流的存在, 因此百分号字符应该被编码为3个字节的序列:”%25”,用于URI内部(0x25为%的ascii码)
编码表可以简单的以ASCII码表为准(见下)
ASCII编码
ASCII 由电报码发展而来,经过多次更新至今为止共定义了128个字符;其中33个字符无法显示(一些终端提供了扩展,使得这些字符可显示为诸如笑脸、扑克牌花式等8-bit符号),且这33个字符多数都已是陈废的控制字符。控制字符的用途主要是用来操控已经处理过的文字。
可以简单的分为控制字符和可显示字符
用十进制来表示的话,031+127位为控制字符,32126为可显示字符,其中48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等
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)。
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/" |
将base64解码成字符串
import base64 |