Python3中编码与解码之Unicode与bytes的讲解
前言
在Python编程中,我们常常需要访问外部资源,如文件、数据库等,这些外部资源中的数据往往是以各种字符集编码的。Python中对字符的处理主要会用到Unicode和bytes两种类型。本文将从Unicode和bytes两种类型入手,详细介绍Python中的编码与解码。
Unicode介绍
Unicode是一种字符集,Python3中的str类型就是基于Unicode的。Unicode字符集包含了全世界所有的字符,包括中文、日文、韩文、英文等。每个字符都对应了一个唯一的编码,这些编码被称为码点。
在Python3中,我们可以使用字符串常量来表示Unicode字符集,例如:
s = 'Hello, 世界'
这里的s
是由Unicode字符表示的一个字符串。
bytes介绍
bytes是Python3中的字节类型,它是Python3中表示字节序列的类型。当我们需要访问外部资源时,外部资源往往会返回一些字节数组,我们需要使用bytes类型来表示和操作这些字节数组。
在Python3中,我们可以使用b
前缀来表示一个字节串,例如:
b = b'\x41\x42\x43\x44\x45'
这里的b
表示由字节构成的一个序列。
编码和解码
当我们需要将字符集从一种编码转换为另一种编码时,我们需要使用编码和解码。在Python3中,我们可以使用encode和decode方法来进行编码和解码操作。
encode方法
encode方法用于将字符串编码为bytes类型的字节序列。可以使用指定的编码方式对字符串进行编码,例如:
s = 'Hello, 世界'
b = s.encode('utf-8')
这里的b
就是由UTF-8编码的字节序列。
decode方法
decode方法用于将bytes类型的字节序列解码为字符串类型。使用指定的编码方式对字节序列进行解码,例如:
b = b'\x48\x65\x6c\x6c\x6f\x2c\x20\xe4\xb8\x96\xe7\x95\x8c'
s = b.decode('utf-8')
这里的s
就是由UTF-8编码的一个字符串。
示例
示例一:读取中文文件
下面的示例代码演示了如何使用Python3读取一个包含中文字符的文件:
#coding:utf-8
with open('chinese.txt', 'r', encoding='utf-8') as f:
s = f.read()
print(s)
这里的chinese.txt
是一个包含中文字符的文件,我们使用with open()
语句按行读取文件内容,然后使用print()
语句输出读取到的内容。对于包含中文字符的文件,需要使用指定的编码方式进行编解码,这里我们使用的是UTF-8编码。
示例二:socket通信
下面的示例代码演示了如何使用Python3进行socket通信:
import socket
HOST = 'localhost'
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
这里我们创建了一个socket对象s
,使用AF_INET
和SOCK_STREAM
参数表示创建IPv4和TCP套接字,然后使用s.connect()
方法连接到指定的主机和端口。通过s.sendall()
方法,我们向服务器发送了一条消息。最后使用s.recv()
方法接收服务器的响应,将响应数据存储在变量data
中。因为socket通信中传输的是字节序列,所以我们需要使用bytes类型来进行编解码。