7. 字符串操作进阶
7.2 字符编码与字符解码

引子

在前一节中,我们讨论了 Unicode 编码以及全球各国使用的不同的字符集。虽然 Python 默认支持 Unicode 标准,但是,在现实世界,我们不能保证所有的文件都使用了 Unicode 编码。假如一个文本文件使用了 gbk 编码,而我们的 Python 程序使用 utf-8 标准进行解码,那就会出现错误。因此,我们在很多实际的开发工作中,不得不进行必要的编解码工作。

本节就将讨论如何在 Python 中对字符串进行编码和解码处理。

字符编解码的基本概念

字符编码是指将字符(如英文字母、中文汉字等)转换为计算机能够理解的二进制数据的过程。相反,字符解码则是指将二进制数据转换为字符的过程。

在 Python 中,我们可以使用内置函数 encodedecode 来进行字符编码和解码。

下面是 encodedecode 方法的简要说明:

  • encode(encoding="utf-8", errors="strict") :该方法使用指定的编码将字符串转换为字节对象。默认编码是 UTF-8;errors 参数指定在编码过程中如何处理错误。

  • decode(encoding="utf-8", errors="strict"):该方法使用指定的编码将字节对象解码为字符串。默认编码是 UTF-8;与 encode 方法类似,errors 参数指定在解码过程中如何处理错误。

让我们来举个例子说明一下 encodedecode 的使用方法:

>>> data = '你好'.encode('utf-8') # 将字符串按照UTF-8格式进行编码
>>> print(data)
b'\xe4\xbd\xa0\xe5\xa5\xbd'
 
>>> text = data.decode('utf-8') # 将字符串按照UTF-8格式进行解码
>>> print(text)
你好

在上面的代码中,我们首先使用了 utf-8 编码方式对字符串 “你好” 进行了编码,这样我们就可以将编码后的字节对象 data 发送到网络或保存到文件;然后,我们又同样使用 utf-8 格式,对字节对象 data 进行了解码,还原成了字符串 test

除了 utf-8 外,我们也可以使用其他的编码方式,如 gbk

>>> data = '你好'.encode('gbk') # 将字符串按照GBK格式进行编码
>>> print(data)
b'\xc4\xe3\xba\xc3'
 
>>> text = data.decode('gbk') # 将字符串按照GBK格式进行解码
>>> print(text)
你好

以上是针对字符串的操作;如果我们需要将字符串数据存储到文件或传输到其他计算机,那么也需要使用编码和解码进行转换。例如:

# 写入文件
with open('data.txt', 'w', encoding='utf-8') as f:
    f.write('你好')
 
# 读取文件
with open('data.txt', 'r', encoding='utf-8') as f:
    text = f.read()
    print(text)  # 输出 你好

在 Python 编程中,字符的编解码是一个非常重要的概念。在处理字符串数据时,我们需要注意以下几点:

  • 选择合适的字符编码方式。在 Python 中,常用的字符编码方式包括 utf-8gbkascii 等。一般来说,我们建议使用 utf-8 编码方式,因为它能编码和解码 Unicode 字符集中的所有字符,且在传输和存储数据时占用空间比较少。

  • 注意字符编码和解码的顺序。在 Python 中,我们通常是先将字符串编码为二进制数据,再将二进制数据解码为字符串。例如:

    # 字符 -> 二进制 -> 字符
    text = '你好'
    data = text.encode('gbk') # 将字符串编码为二进制数据
    text = data.decode('gbk') # 将二进制数据解码为字符串

    如果在字符编码和解码的过程中没有指定正确的字符编码方式,就可能会导致乱码的情况。例如:

    text = '你好'
    data = text.encode('gbk')  # 使用 GBK 编码
    text = data.decode('utf-8')  # 使用 UTF-8 解码

    在这种情况下,编译器会抛出一个 UnicodeDecodeError 异常。

总结

综上所述,Python 使用 encodedecode 两个方法将字符串在不同的编码之间进行转换;在 Python 编程中,encodedecode 方法基本算是处理文本数据的必备工具。