Python3中编码与解码之Unicode与bytes的讲解

  • Post category:Python

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_INETSOCK_STREAM参数表示创建IPv4和TCP套接字,然后使用s.connect()方法连接到指定的主机和端口。通过s.sendall()方法,我们向服务器发送了一条消息。最后使用s.recv()方法接收服务器的响应,将响应数据存储在变量data中。因为socket通信中传输的是字节序列,所以我们需要使用bytes类型来进行编解码。