近期在读“流畅的Python”这本书,想把自己的读书笔记分享给大家,希望能帮到也对这本书感兴趣但是没时间看的各位。(文章中大部分的话和图片摘录总结自“流畅的Python”一书,以及python官方网站)

章节结构:

  • 字符
  • 字节
  • 编码&解码
  • 文本文件
  • Unicode

具体内容:

  • 字符

字符的定义是Unicode字符。
字符的标实是码位(十进制数字),在Unicode标准中是四位十六进制数字加前缀U+。Ex.A = U+0041
字符的具体表述取决于所有编码。编码是在码位和字节序列之间转换时使用的算法。Ex.UTF-8,A(U+0041) = x41
编码 = 码位 -> 字节序列 (用于传输或存储)
解码 = 字节序列 -> 码位 (人类可读文本)

  • 字节

Python有两种内置序列类型,bytes和bytearray,这两种类型的对象的各个元素时介于0-255
bytes对象可以从str对象使用给定的编码构建,各个元素时range(256)内的整数,bytes对象的切片还是bytes
bytearray对象没有字面量句法,二十一bytearray()和字节序列字面量参数的形式显示,bytearray对象的切片还是bytearray
结构体(struct模块)提供函数,把打包的字节序列转换成不同类型字段组成的元组,还有一些函数用于执行反转,把元组转换成打包的字节序列,该模块可以处理bytes,bytearray和memoryview对象
内存试图(memoryview)哟关于共享内存,用于访问二进制序列,打包的数组,和缓冲中的数据切片时无需复制字节序列

  • 字符串

字符串时一个字符序列

  • 编码&解码

不同的编解码器
Encode.png
几种编解码错误

错误 原因 解决方案
UnicodeDecodeError 把二进制序列转换成字符串时,比如出现无效的UTF-8/UTF-16 替换为官方未知字符
UnicodeEncodeError 把字符串转化成二进制序列时,比如目标编码中没有定义某个字符 替换,跳过(不推荐),把无法编码的字符转换成XML实体
SyntaxError 源码的编码与预期不符 文件顶端添加注释,不过最好使用UTF-8

如何知道字节序列的编码?BOM
BOM,byte-order mark,字节序标记,告诉我们编码类型,Ex.u16 = b'xffxfe........,这一部分就是告诉我们编码时使用Intel CPU的小字节序
规范化Unicode字符串
之所以需要规范化Unicode字符串是为了避免比较字符串时出现错误,因为相同的字符串可能因为Unicode的构成方式而出现不同码位,从未在比较是返回false。我们可以运用unicodedata.normalize函数提供的Unicode规范化,这个函数的第一个参数要传入(NFC,NFD,NFKC, NFKD)中的一个
NFC Normalization Form C, 是用最少的码位构成等价的字符串
NFD,Normalization Form D, 把组合字符分解成及字符和单独的组合字符
NFKC & NFKD都是用于兼容字符的严格规范方式,每个兼容字符会被替换成兼容分解字符,这两种方式最好慎用。

  • 文本文件

处理文本的最佳实践时Unicode三明治
bytes->str:解码输入的字节序列
100% str:只狐狸文本
str->bytes: 编码输出的文本
意思是今早把输入的字节序列解码成字符串(比如读取一个文件的时候)
Unicode文本排序
使用PyPI中的PyUCA库(Unicode Collation Algorithm Unicode排序算法)


猜猜我是谁
18 声望5 粉丝

一个话痨的技术小白