【流畅的python】笔记(C4 文本和字节序列)自测知识点和书籍补充

    技术2026-01-17  6

    文章目录

    C4 文本和字节序列4.1 字符问题自测答案 4.2 字节概要自测答案 4.4 了解编解码问题自测答案 4.4.1 处理 UnicodeEncodeError自测答案 4.4.4 如何找出字节序列的编码自测答案 4.5 处理文本文件自测答案 4.6 为了正确比较而规范化Unicode字符串自测答案

    C4 文本和字节序列

    4.1 字符问题

    自测

    1. 字符的官方定义是什么编码格式 2. 什么是编码?什么是解码 3. py3的 str 类型和 Python 2 的 unicode 类型完全等价吗?

    答案

    1. “字符”的最佳定义是 Unicode 字符。因此,从 Python 3 的 str 对象中获取 的元素是 Unicode 字符,这相当于从 Python 2 的 unicode 对象中获取的元素,而不是从 Python 2 的 str 对象中获取的原始字节序列。

    2. 把 str转换成bytes的过程是编码;把 bytes转换成 str的过程是解码。 如果想帮助自己记住 .decode() 和 .encode() 的区别,可以把人类可读的文本看作是“字”正常和不可读的看为“字”中毒的样子。如果“字”中毒了是不是要给他服解药,这就是在解码吧。


    3. 是的,只不过是换了个新名称。 (但是后文的 Python 3 的 bytes 类型却不是把 str 类型换个名称那么简单,而且还有关系紧密的bytearray 类型。)

    4.2 字节概要

    自测

    1. bytes和bytearray 区别,以及它们在python哪个版本出现? **2. memoryview作用 **

    答案

    1. Python 3 引入的不可变 bytes 类型和 Python 2.6 添加的可变 bytearray 类型。(Python 2.6 也引入了 bytes 类型,但那只不过是 str 类型的别名,与Python 3 的 bytes 类型不同。)

    2. memoryview 类不是用于创建或存储字节序列的,而是共享内存,让你访 问其他二进制序列、打包的数组和缓冲中的数据切片,而无需复制字节序列。例如 Python Imaging Library(PIL) 2 就是这样处理图像的。 注意, memoryview 对象的切片是一个新 memoryview 对象,而且不会复制字节序列。

    4.4 了解编解码问题

    自测

    1. 在处理编码时,常见的三种错误代表什么意思?

    答案

    1. 虽然有个一般性的 UnicodeError 异常,但是报告错误时几乎都会指明具体的异常:UnicodeEncodeError (把字符串转换成二进制序列时); UnicodeDecodeError (把二进制序列转换成字符串时)。 如果源码的编码与预期不符,加载 Python 模块时还可能抛出SyntaxError 。接下来的几节说明如何处理这些错误。

    4.4.1 处理 UnicodeEncodeError

    自测

    1. 在编码和解码中处理错的常见的是哪两种?

    答案

    1. ➍ error=‘ignore’ 处理方式悄无声息地跳过无法编码的字符;这样做通常很是不妥。 ➎ 编码时指定 error=‘replace’ ,把无法编码的字符替换成 ‘?’ ;数据损坏了,但是用户知 道出了问题。

    4.4.4 如何找出字节序列的编码

    自测

    1. 如何找出字节序列的编码?

    答案

    1. 不能。各种字节流方式编码复杂,我们并不能100%确定是什么编码。然而有的包可以去找到字节流的特定规则,进而告诉你是什么编码。 Chardet 是一个 Python 库,可以在程序中使用。

    4.5 处理文本文件

    自测

    1. 你为什么要使用二进制打开文本文件? 2. 读取文本时并未编码会怎么样?

    答案

    1. 除非想判断编码,否则不要在二进制模式中打开文本文件;即便如此,也应 该使用 Chardet,而不是重新发明轮子(参见 4.4.4 节)。常规代码只应该使用二进制模式打开二进制文件,如光栅图像。

    2. 会受到系统的默认编码产生变化。如下我的电脑实验: 现在加了一句话,它又回复正常了

    4.6 为了正确比较而规范化Unicode字符串

    自测

    1. 变音符号或一些难以处理的数学符号在处理起来有什么难度? 2. 变音符号怎么处理? 3. normalize 的四种类型特性?

    答案

    1. 在不Unicode的两种表示中,虽然两者表示,其实代表的是一种字符。,

    2. 使用 unicodedata.normalize 函数提供的 Unicode 规范化。 这个函数的第一个参数是这 4 个字符串中的一个: ‘NFC’ 、 ‘NFD’ 、 ‘NFKC’ 和 ‘NFKD’ 。

    **3. ** 先说明UFC和UFD: 另外,西方键盘通常能输出组合字符,因此用户输入的文本默认是 NFC 形式。不过,安全起见,保存文本之前,最好使用 normalize(‘NFC’, user_text) 清洗字符串。NFC 也是 W3C的“Character Model for the World Wide Web: String Matching and Searching”规范。 但作者在讲解两种的区别时,除了说明它们获得的长度会有所不同以外,其他的并没有说明。如下图我实验后,发现其实它们在得到最终的结果都一样的,因此不必太纠结了。 NFC 和 NFD 可以放心使用,而且能合理比较 Unicode 字符串。对大多数应 用来说,NFC 是最好的规范化形式。

    相较于UFC和UFD这两种只在特殊情况下使用,比如做搜索时,我们不想总渴望用户输入组合字符,这种分解却正好能让用户有更一般的输入。

    Processed: 0.034, SQL: 9