编码与解码
二进制、八进制、十六进制
简单地说,就是逢二进一,逢八进一,逢十六进一。
识别方式
- 二进制数据最好识别,除了0就是1的就是。
八进制通常在开头加0b 作为标志。1
2
3python
>bin(16)
0b10000 - 八进制数据(base‐8),包括0‐7。
八进制通常在开头加0 作为标志。
例如: 16(十进制)的八进制为20。写出来就是020
用python转换: print oct(16) - 十六进制(base‐16),包括0‐9,A‐F,不区分大小写。
它的标志是0x
例如:44(十进制)的十六进制为2c,写出来就是0x2c
用python,十进制转十六进制: print hex(44)
用shell命令,字符串转十六进制: echo data | xxd ‐p
十六进制转字符串: echo data | xxd ‐r ‐pBase‐36
包括0‐9,A‐Z。不区分大小写,字母要么全部都是大写,要么全部都是小写,A=a。
base36很少用,不然在python中也会像上面的进制转换一样,直接用一个函数就能转换了。
首先需要安装base36模块,然后1
2
3
4>>>import base36
>>> import base36
>>> assert base36.dumps(19930503) == 'bv6h3'
>>> assert base36.loads('bv6h3') == 19930503Base‐64
包括A‐Z、a‐z、0‐9、+、/(26*2+10+2=64)
base64经常用在网络传输中。因为网络协议们是有着很久远的历史,支持的字符很少,安全性也是完全没有考虑过的事情。
为了传送一些不支持的字符,就编码一下。
a的ascii码是97,97的二进制是1100001
b的ascii码是98,98的二进制是1100010
所以ab的二进制就是1100001 1100010
把这串二进制以6位分组,就是11000 011100 010
然后再转换为十进制,11000的十进制是24,24再转换为ascii码。
末尾特殊规定:最后010 的二进制是2,但是2的ascii码不在A‐Z,a‐z,0‐9那些64字符中,最小的A的ASCII码为65。
所以,010干脆用=代替,只要最后一位很小,不能用ascii码表示的,就用=表示。
base64的特征有末尾的==(经常有,但也可能没有=)。
在linux环境,经常用1
echo '需要解码的base64数据' | base64 ‐d
URL编码
通常出现在url地址上,方便传输(空格等字符不方便传输)。
包括%和十六进制数。
特征:就是%,当你看到如下字符,就能立即反应过来这是url编码的字符。每个字符由三位组成,%和两位十六进制数,这个十六进制数是某个ASCII码转换而成的。python编码1
%E6%96%87%E7%AB%A0/%E5%8D%9A%E5%AE%A2%E5%A4%87%E4%BB%BD/%E5%A4%87%E4%BB%BD/%E8%99%9A%E6%8B%9F%E6%9C%BA%E5%AE%9E%E9%AA%
解码print urllib.unquote('%D6%D0%CE%C4')
HTML实体编码
在html(超文本传输协议)中,有些字符用编程的术语来说就是“标识符”。标识符是预定义的,而我们写代码的时候不能把变量名起名为标识符。所以
html编码就是把“标识符”用“实体”代替。
html实体编码的特征:包括& ; 和英文小写字母字符。
特征:
<>
ASCII
美国信息交换标准码
Unicode是ASCII码的扩展,用2个字节,宽字符集。
php escape() 函数
可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。
_escape函数括号里的字符串是_必需的,是要**被转义或编码**的字符串
该方法不会对ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码:*** @ - _ + . /**。其他所有的字符都会被转义序列替换。
utf‐8 编码与unicode
例子
1 |
|
utf-8又叫做8‐bit Unicode Transformation Format,直译就是可变长度的unicode。
ascii码是美国人发明的,只包括英文字符和一些符号,无法表达其他国家的文字。
unicode是为了解决其他国家的字符问题。可想而知,全世界有上百个国家,而一个国家至少有1套字符,所以unicode需要用更长的01101101数据,来代表一个字符。
那么问题来了,如果一个英文文本,如果是unicode格式,那么在网络上传输的话,比ASCII格式的长度要大很多!
有人又说了,那么我转换为ASCII码格式不就行了嘛?
但是,如果是中英文混合呢?比如说一篇医学技术论文,中文里夹杂英文专业术语?如果转为ASCII码,那中文不就乱码了吗?
为了解决这个传输问题。utf-8编码出现了,如果是ASCII码里的,就用ASCII码里的,如果不是,就用unicode里的。可以简单理解为(ASCII+unicode)等于utf-8
?中文与utf-8编码的关系。
(ASCII+unicode)约等于utf-8
中文字符是unicode的子集。所以可以说,中文可以用utf-8表示。
?unicode转utf-8
1 |
|
unicode只有转换为str(utf-8)才能用url编码传输。
- ?中文转为URL编码
在linux中,中文都是utf-8编码的。用quote()函数即可完成转换。 - ?URL编码转为u ‐8
如果要显示为中文,用print函数直接输出即可。
print urllib.unquote(b)
gbk与utf-8
在unicode出现之前,各个国家都有自己的编码方式,gbk就是中文的编码方式(话说中国和台湾用的不是同一种编码,悄声说)
windows的中文就是用的gbk编码,而linux的中文用的就是utf-8编码,所以文本复制时候,可能会乱码。
linux命令,gbk转utf‐8;如果转回来,gbk和utf‐8交换位置即可。
xx.txt是gbk格式文档,final是成功转换的utf‐8文档。iconv ‐f gbk ‐t utf‐8 xx.txt > final.txt