Python | 认识编码
编码(Encoding)是将字符转换为计算机可以处理的二进制数据的过程。在计算机中,所有的文本都是以二进制形式存储的,因此需要使用编码将文本转换为二进制数据。Python 中的编码指的是将字符串转换为字节串(bytes)的过程,或将字节串转换为字符串的过程。
编码与解码
在 Python 中,字符串是以 Unicode 编码存储的,而字节串则是以二进制形式存储的。Python 中在进行数据传输、存储或处理时,需要将字符串转换为字节串或将字节串转换为字符串。下面介绍 Python 中的编码和解码函数以及使用方法。
编码函数:
encode(encoding='utf-8', errors='strict')
:将字符串编码为字节串,参数encoding
指定编码方式,参数errors
指定编码错误的处理方式。例如:
s = "Hello, World!"
b = s.encode('utf-8')
print(b) # b'Hello, World!'
bytes(string, encoding='utf-8', errors='strict')
:将字符串编码为字节串,与encode()
函数类似,但是可以直接将字符串转换为字节串。例如:
s = "Hello, World!"
b = bytes(s, 'utf-8')
print(b) # b'Hello, World!'
解码函数:
decode(encoding='utf-8', errors='strict')
:将字节串解码为字符串,参数encoding
指定编码方式,参数errors
指定解码错误的处理方式。例如:
b = b'Hello, World!'
s = b.decode('utf-8')
print(s) # Hello, World!
str(object='', encoding='utf-8', errors='strict')
:将字节串解码为字符串,与decode()
函数类似,但是可以直接将字节串转换为字符串。例如:
b = b'Hello, World!'
s = str(b, 'utf-8')
print(s) # Hello, World!
在进行编码和解码时,需要注意以下几点:
- 需要使用相同的编码方式进行编码和解码,否则会出现乱码或编码错误。
- 在进行文件读写时,需要指定文件的编码方式,以便正确地读写文件。
- 在进行网络通信时,需要将数据转换为二进制形式进行传输,并在接收方进行解码,以便正确地解析数据。
编码方式
Python 支持多种编码方式,在 Python 3.x 中,默认字符串的编码方式为 UTF-8。其中,UTF-8 是最常用的编码方式之一,它可以表示几乎所有的字符集,同时也是互联网和电子邮件中的标准编码方式。
1、UTF-8
UTF-8(Unicode Transformation Format-8)是一种变长字符编码,用于将 Unicode 字符集中的字符编码为字节串。UTF-8 是一种通用的字符编码方式,支持几乎所有的字符集,是互联网和电子邮件中的标准编码方式。
UTF-8 编码是一种可变长编码方式,采用 1~4 个字节表示一个字符。对于 ASCII 字符集中的字符,UTF-8 使用一个字节表示,与 ASCII 编码兼容,即 ASCII 编码和 UTF-8 编码的前 128 个字符是一样的。对于其他字符,UTF-8 使用多个字节表示,不同的字符使用不同的字节数表示,具体规则如下:
- 对于
0x00000000 ~ 0x0000007F
(ASCII 字符集),使用 1 个字节表示,ASCII 编码和 UTF-8 编码相同。 - 对于
0x00000080 ~ 0x000007FF
,使用 2 个字节表示,第一个字节的前 5 位为 110,第二个字节的前 2 位为 10。 - 对于
0x00000800 ~ 0x0000FFFF
,使用 3 个字节表示,第一个字节的前 4 位为 1110,第二、三个字节的前 2 位为 10。 - 对于
0x00010000 ~ 0x001FFFFF
,使用 4 个字节表示,第一个字节的前 3 位为 11110,第二、三、四个字节的前 2 位为 10。
UTF-8 编码可以使用 Python 中的 encode()
函数将字符串编码为字节串,例如:
s = "你好,世界!"
b = s.encode('utf-8')
print(b) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'
UTF-8 编码也可以使用 Python 中的 decode() 函数将字节串解码为字符串,例如:
b = b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81'
s = b.decode('utf-8')
print(s) # 你好,世界!
总之,UTF-8 是一种通用的字符编码方式,支持几乎所有的字符集,在 Python 中也得到了广泛的应用。在进行编码和解码时,需要注意使用相同的编码方式进行处理,以避免出现乱码或编码错误。
2、GB2312
GB2312 是一种中文编码方式,是中国国家标准 GB 2312-1980 中规定的字符集编码方式。GB2312 编码方式使用 2 个字节表示一个字符,其中第一个字节的范围是 0xB00xF7
,第二个字节的范围是 0xA10xFE
,共包含 6763 个常用汉字和符号。
GB2312 编码方式不支持繁体字和生僻字,因此在使用中文编码方式时,需要根据实际需要选择合适的编码方式。由于 GB2312 编码方式仅适用于中文字符集,不支持英文字符集和其他语言字符集,因此在进行跨语言编程和跨语言通信时,需要使用更通用的字符编码方式,如 UTF-8。
在 Python 中,可以使用 GB2312 编码方式将字符串编码为字节串,例如:
s = "你好,世界!"
b = s.encode('gb2312')
print(b) # b'\xc4\xe3\xba\xc3\xa3\xac\xca\xc0\xbd\xe7\xa1\xa3'
GB2312 编码方式也可以使用 Python 中的 decode()
函数将字节串解码为字符串,例如:
b = b'\xc4\xe3\xba\xc3\xa3\xac\xca\xc0\xbd\xe7\xa1\xa3'
s = b.decode('gb2312')
print(s) # 你好,世界!
需要注意的是,在使用 GB2312 编码方式时,需要保证编码方式的一致性,以避免出现乱码或编码错误。同时,由于 GB2312 编码方式仅适用于中文字符集,因此建议在进行跨语言编程和跨语言通信时使用更通用的字符编码方式,如 UTF-8。
3、GBK
GBK 是一种中文编码方式,是 GB2312 编码方式的扩展,支持更多的汉字和符号。GBK 编码方式使用 12 个字节表示一个字符,其中第一个字节的范围是 0x81~0xFE
,第二个字节的范围也是 0x40~0xFE
。GBK 编码方式共支持 21886 个汉字和符号,包括 GB2312 中的所有字符和一些生僻字。
GBK 编码方式是中国国家标准 GBK 13000-2018 中规定的字符集编码方式,是 GB2312 编码方式的标准扩展方式,广泛应用于中文计算机系统和中文网页编码中。
在 Python 中,可以使用 GBK
编码方式将字符串编码为字节串,例如:
s = "你好,世界!"
b = s.encode('gbk')
print(b) # b'\xc4\xe3\xba\xc3\xa3\xac\xca\xc0\xbd\xe7\xa1\xa3'
GBK 编码方式也可以使用 Python 中的 decode()
函数将字节串解码为字符串,例如:
b = b'\xc4\xe3\xba\xc3\xa3\xac\xca\xc0\xbd\xe7\xa1\xa3'
s = b.decode('gbk')
print(s) # 你好,世界!
需要注意的是,在使用 GBK 编码方式时,需要保证编码方式的一致性,以避免出现乱码或编码错误。同时,由于 GBK 编码方式仅适用于中文字符集,因此建议在进行跨语言编程和跨语言通信时使用更通用的字符编码方式,如 UTF-8。
4、ISO-8859-1
ISO-8859-1(也称为 Latin-1)是一种单字节编码方式,用于表示拉丁字母表中的字符,包括英语、法语、德语、西班牙语等欧洲语言中的所有字符。ISO-8859-1 编码方式使用 1 个字节表示一个字符,范围是 0x00~0xFF
,共支持 256 个字符。
ISO-8859-1 编码方式不支持中文字符集、日文字符集和韩文字符集,因此在进行跨语言编程和跨语言通信时,需要使用更通用的字符编码方式,如 UTF-8。
在 Python 中,可以使用 ISO-8859-1 编码方式将字符串编码为字节串,例如:
s = "Hello, World!"
b = s.encode('iso-8859-1')
print(b) # b'Hello, World!'
ISO-8859-1 编码方式也可以使用 Python 中的 decode()
函数将字节串解码为字符串,例如:
b = b'Hello, World!'
s = b.decode('iso-8859-1')
print(s) # Hello, World!
需要注意的是,在使用 ISO-8859-1 编码方式时,需要保证编码方式的一致性,以避免出现乱码或编码错误。同时,由于 ISO-8859-1 编码方式仅适用于欧洲语言字符集,因此建议在进行跨语言编程和跨语言通信时使用更通用的字符编码方式,如 UTF-8。
应用场景
除了字符串和字节串之间的转换,编码在 Python 中还有其他方面的应用。下面列举了几个常见的应用场景:
- 文件读写:在 Python 中,文件的读写需要指定文件的编码方式。例如,可以使用 open() 函数打开文件,并指定文件的编码方式,然后对文件进行读写操作。
- 网络通信:在进行网络通信时,需要将数据转换为二进制形式进行传输。在 Python 中,可以使用编码函数将字符串转换为字节串,然后通过网络传输,接收方再将字节串转换为字符串。
- 数据库操作:在进行数据库操作时,需要将字符串转换为字节串或将字节串转换为字符串。在 Python 中,可以使用编码函数将字符串转换为字节串,然后存储到数据库中,或从数据库中读取字节串,并使用解码函数将其转换为字符串。
- 数据处理:在进行数据处理时,需要将不同编码方式的数据进行转换和处理。在 Python 中,可以使用 codecs 模块对不同编码方式之间的数据进行转换和转码。
总结
总之,编码在 Python 中有着广泛的应用,涉及到多个方面,开发者需要了解不同编码方式之间的差异和转换方法,以便正确地处理字符串和字节串。同时,为了确保代码的可读性和可维护性,建议使用统一的编码方式(如 UTF-8)进行开发和存储,避免出现编码问题。