2019.7.17:编码
前言:bit=比特=位=b byte=字节=B 1B=8b
1、
ASCII编码
用1B进行编码,最多28=256个字符 'd'=100 D=d-32=68 以此可以推算其他字母对应的数字
Unicode编码
ASCII编码只能编入英文字母等符号,所以Unicode编码应运而生,常用的是2个字节表一个字符,生僻字符会用到4个字节
UTF-8编码
把定长的Unicode编码变为了可变长编码,从1B到6B,常用英文字母为1B(与ASCII编码对应),汉字通常为3B,如果传输的文件包含大量英文字符,就可以用UTF-8编码
另外 ASCII编码可以视为UTF-8编码的一部分
| ASCII | Unicode | UTF-8 | |
| A | 01000001 | 00000000 01000001 | 01000001 |
| 汉字“中” | 无 | 01001110 00101101 | 11100100 10111000 10101101 |
计算机内存中统一使用Unicode编码,在硬件保存或者传输时采用UTF-8编码
用记事本编辑时,会将从文件中读取的UTF-8转化为Unicode存到内存中,编辑完成后保存时再把Unicode转化为UTF-8保存到文件中

而在访问网页时,服务器将Unicode内容转化为UTF-8再传输到浏览器,很多网页源码上会出现类似
<meta charset="UTF-8" />
表示网页采用UTF-8编码
2、Python 字符与编码
Python出现的比Unicode早,普通的英文字符串如'ADE'在Python中都以ASCII编码,可以用ord和chr完成ASCII字符与其对应数字的转化
ord('A')=65 chr(65)='A'
后来添加了对Unicode的支持,以Unicode表示的字符串有个前缀u

u'你好'和u'\u4f60\u597d'是相同的,\u表示16进制,用16进制表示的unicode编码4f60即为中文汉字'你',同理16进制Unicode'597d'是'好'
ASCII编码同样可以视为UTF-8编码,所以在进行编码转换时只需考虑Unicode和UTF-8间的转化即可,
u'XXX'转化为UTF的'XXX'的方法:encode('UTF-8'),反过来转化是decode('UTF-8'),UTF不区分大小写,英文字符转化候的Unicode与UTF-8值相同但占用内存不同(2B与1B)
如:
u'你'.encode(‘UTF-8’)

逆向转化:

字符串大小可以通过len函数获得:

可以得到unicode与UTF-8的区别:1、所占字节大小不同 2、unicode表示的字符前要加u UTF-8不需要
3、保存Python文件
Python文件也是文本文件,所以当源码中包含中文时,需要指定用UTF-8编码保存,为了让Python解释器按照UTF-8编码读取,需要在文件开头加上两行
#!/usr/bin/env python #coding=utf-8
第一行是告诉Linux/OS 系统,这是一个python可执行程序,而Windows会自动忽略这一条
第二行告诉Python解释器按照utf-8编码读取源码,否则可能会出现中文乱码情况
Python2.X的unicode和UTF-8是以u前缀区分的
而Python3.X吧二者统一成了unicode编码,写不写前缀u都一样,但以字节形式表示的字符串必须交上前缀b即 b'XXX'

浙公网安备 33010602011771号