一、认识字符编码
在计算机中,所有的数据都是存储在二进制的形式下的,字符也不例外,因此需要将字符转化成二进制,计算机才能够处理,这个转化的过程就是编码。编码就是一套规则,将字符集映射为一系列二进制数字。常用的字符集编码有ASCII码、Unicode和UTF-8等。
ASCII码是由美国人制定的一套字符集编码标准,最初只包含128个字符(大小写字母、数字和部分符号),后来扩展到了256个字符,用于英文和西欧语言。ASCII码的缺点是不能表示中文、日文、韩文等日常常用的字符。
因此,随着国际语言的普及,Unicode应运而生。Unicode是全球通用的一种字符集编码,它包含了世界上所有的字符集,不仅包含了拉丁文的字符集,还包括中文、日文、阿拉伯文等自然语言的字符集。Unicode的码位支持17个平面,每个平面最多可以容纳65536个码位,总共可以支持1,114,112个码位,一一对应地对应了世界上所有的字符。(注:Unicode存在与存储器中的方式有所不同,可以是UTF-8,也可以是UTF-16,UF-32等)。
UTF-8是一种针对Unicode的可变长度字符编码,它可以用来表示Unicode标准中的任何字符,且其编码后的字节可以用ASCII码表示。UTF-8采用变长编码,将一个码位转化成1~4个字节,根据字符所处的Unicode码位选择适当长度的存储。
二、Python字符串编码
Python字符串在内部都是以Unicode存储的,因此可以处理不同国家的字符,但是将Unicode编码保存在硬盘上的时候,需要将其转换成字节序列,这时候就遇到了字符集编码的问题。如果编码方式不同,那么就可能会出现乱码现象。 对于Python,我们一般将字符串表示为unicode,而将文件存储到磁盘中时需要使用一种编码方式(如UTF-8)将字符串编码成utf-8格式的字节序列,这样在读取该文件之后才能够正确地将字节序列解码成unicode格式的字符串。
s = 'Python编码测试' print(s) print(s.encode('utf-8'))
执行上述代码,输出如下:
'Python编码测试' b'Python\xe7\xbc\x96\xe7\xa0\x81\xe6\xb5\x8b\xe8\xaf\x95'
在编码时,可以使用Python内置的字符串方法encode()方法将Unicode字符串转换成字节数据存储到硬盘中。
三、解决乱码问题
乱码就是因为编码方式不正确,也就是在对数据进行获得或者将数据进行传输或者存储的过程种,编码发生了错误,使得数据的内容被错误地转换,最终出现乱码。
当从文件中读取数据时,需要将字节转换成字符串,这时候就需要使用字符串的decode()方法。通常情况下,我们可以传递一个编码参数,表示对字节进行解码时所采用的字符集编码方式,如果不知道字符编码方式,可以通过chardet库进行检测。
在使用Python进行数据爬取时,会经常遇到网页中存在中文,但是爬取下来的内容是乱码的情况。此时,可以使用requests库中的response.encoding属性和response.content属性进行解码。其中,response.encoding属性表示当前HTTP的编码方式,而response.content属性则可以直接返回字节型的数据。
import requests import chardet url = 'https://www.baidu.com/' response = requests.get(url) content = response.content print(chardet.detect(content)) print(content.decode('utf-8'))
执行上述代码,输出如下:
{'encoding': 'utf-8', 'confidence': 0.99, 'language': ''} <!DOCTYPE html>