python自测知识点和书籍补充(C4 文本和字节序列)

2022-08-10,,,,

文章目录

  • 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这两种只在特殊情况下使用,比如做搜索时,我们不想总渴望用户输入组合字符,这种分解却正好能让用户有更一般的输入。

本文地址:https://blog.csdn.net/ngadminq/article/details/107129820

《python自测知识点和书籍补充(C4 文本和字节序列).doc》

下载本文的Word格式文档,以方便收藏与打印。