python2.x和python3.x默认字符编码区别
python2.x默认编码为ASCII,不支持中文显示,要指定字符集。
python3.x默认编码为unicode,支持中文显示。
什么是字符编码
计算机只能识别0或1的二进制序列,一个0或1为一个比特(bit)、八个比特为一个字节(byte)、1024个比特为一个千字节(kilo byte).....。
因此在向计算机存储或读取数据是就存在将字符转为二进制码、将二进制码转为字符的过程。
字符编码就是一张字符与二进制编码一一对应的一张表格。
有哪些常用的字符编码
ASCII码
使用最广泛的是由美国国家标准局(ANSI)定制的ASCII码(American Standard Code for Information Interchange 美国标准信息交换码)。
一个ASCII码存储在计算机中占一个字节就是8bit,8个比特可以表示出28就是256种状态,二进制取值范围为(00000000-11111111)。
标准ASCII码也叫基础ASCII码使用7位二进制数表示128个字符,使用最高位第7位做校验位,校验方法分为奇校验和偶校验。
奇校验规定一个正确的ASCII码中1的个数要为奇数个如果不是则在最高位添1,偶校验原理相同,不过1的个数必须为偶数个。
Unicode
但是128个字符无法表示世界上所有国家的语言,所以各国开始编写自己的编码格式,向中文就有GB2312,GBK等等。
但是这让国与国之间的交流出现了问题,国与国之间的编码方式不相容会造成鸡同鸭讲的情况,为解决这个问题Unicode编码就出现了。
Unicode被称为统一码、万国码、单一码,它可以表示世界上所有的字符或符号。
Unicode至少由两个字节表示一个字符,但是Unicode只定义了编码方式,并未定义如何存储,那么计算机如何识别几个字节是一个字符,而且英文字符只需要一个字节那么剩下的一个字节的空间就浪费掉了。UTF-8就是Unicode编码的一种实现方式,UTF-8是一种变长编码方式,使用1-4个字节表示一个符号。
UTF-8
UTF-8是Unicode的一种实现方式,也是现今互联网上使用最广泛的一种编码方式。UTF-8完全兼容ASCII码,对于ASCII中的字符UTF-8采用相同的编码值。
GB2312
GB2312为中文编码,使用分区处理,存储大小为两个字节,高字节存储区,低字节存储位。
GB2312共分为94个区,每个区有94个位,其中1-9区存储除汉字外的682个字符,16-55区存储按拼音排序的3755个一级汉字,56-87区存储按偏旁/笔画排序的3008个二级汉字,其他区为空白,没有使用。
GB2312收录了6763(3755+3008)个汉字,覆盖了中国大陆使用的99.75%的汉字但有些汉字没有被编码。
GBK
GBK编码是GB2312的扩展,双字节编码。完全兼容GB2312编码,但不兼容BIG5,能够表示21003个汉字。
BIG5
BIG5双字节编码,使用两个字节表示一个字符,是繁体中文编码标准,收录13060个中文字。
Latin-1
Latin-1是ISO-8859-1的别名,它是在标准的ASCII码基础上又进行了扩展,标准ASCII码使用7位二进制(00000000-011111111),而Latin-1将剩余(10000000-11111111)也进行了编码,使编码数量扩大到256个。
什么是编码、解码
编码(encode):对于Unicode码来说,是在Unicode编码集中找到与该字符对应的字节码。就是在指定要编码的字符集中找到与该字符对应的字节码。
解码(decode):将字节码在特定的编码集中找到与之对应的字符。
字符编码在什么地方发生
在python中字符编码或解码会发生在两种地方:磁盘写入/读取,程序执行输入/输出。
python中使用chardet模块检测数据编码方式
安装chardet模块:pip install chardet
普通方式from urllib.request importurlopen,Requestimportjson,collectionsimportchardet
url= r'https://movie.douban.com/j/chart/top_list?'\
r'type=11&interval_id=100%3A90&action=&start=0&limit=1'head= {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36'
'(KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}
request= Request(url,headers=head)
html=urlopen(request)print(chardet.detect(html))#运行结果: {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
高级方式from urllib.request importurlopen,Requestimportjson,collectionsfrom chardet.universaldetector importUniversalDetector
detector=UniversalDetector()for line inhtml.readlines():
detector.feed(line)if detector.done: breakdetector.close()
html.close()print(detector.result)#运行结果: {'encoding': 'utf-8', 'confidence': 0.99, 'language': ''}
python中转换字符对应的unicode标准名称
from unicodedata importlookup,name
string= 'é'n= name(string) #将字符串转为对应的unicode名称
l = lookup(n) #将unicode名称转为对应字符串
print(l,':',n)#é : LATIN SMALL LETTER E WITH ACUTE
python中encode()和decode()函数
'''语法:
str.encode(encoding='UTF-8',errors='strict')
要使用的编码方式,值可以为ascii、utf-8、lantin-1、cp-1252(Windows常用编码)
unicode-escape(python中unicode的转义文本格式)
strict:当遇到无法编译的字符是抛出UnicodeEncodeError异常。
ignore:会抛弃无法编译的字符。
replace:会将无法编译的字符替换为?。
backslashreplace:会创建一个和unicode-escape类似的unicode字符串(b'\\u2603')。
xmlcharrefreplace:创建一个网页中使用的字符实体串。'''string= '123À'
print(string.encode('gbk',errors='ignore')) #b'123'
print(string.encode('gbk',errors='replace')) #b'123?'
print(string.encode('gbk',errors='backslashreplace')) #b'123\\xc0'
print(string.encode('gbk',errors='xmlcharrefreplace')) #b'123À'
decode()方法与encode()方法类似,是将特定类型字节码编译为字符串,并且strict抛出的是UnicodeError错误。