对于字符串,我们接触得挺多的。而编码问题,也不时令人头疼的。
由于一开始接触的就是 Python3,所以一些在 Python2 上的编码上的坑我没遇到,甚至在 Python3 上都很少遇到编码问题,因为 Python3 默认的编码是 utf-8,而之前又从 Windows 转到了 Arch,编码问题已经很少遇到了。
不过还是要重新认识一下字符与字节。字节可由指定字符串编码得到,是不可变类型。使用下标获取字节的值时,返回的是整数。这个是没想到的。很多适用于 str 对象的方法也适用于 bytes 对象。
struct 模块提供了一些函数可把字节序列与其他不同的类型互相转换。memoryview 用于共享内存,前面刚碰到过。
除了 utf-8 编码,Python 还内置了许多其他的编码器。不同编码器编码的相同的字符,最终的字节大小可能会不同。
对于 UnicodeEncodeError 和 UnicodeDecodeError,是由于对应编码不能处理字符串 / 字节导致的。而 SyntaxError,则是由于没有声明编码,平台编码不能处理对应模块的 .py 文件。
在处理文件文件时,建议是指定编码打开或写入,不然跨操作系统运行脚本可能会出错。
之后,讲到了规范化 Unicode 字符串。之前是一直没想过这样的问题,一些特殊字符,该怎么搜索?这里给出了答案,那就是使用 unicodedata.normalize 函数提供的
Unicode 规范化。它有四个参数:NFC
、NFD
、NFKC
和NFKD
。
NFC(Normalization Form C)使用最少的码位构成等价的字符串,而 NFD 把组合字符分解成基字符和单独的组合字符。
在另外两个规范化形式(NFKC 和 NFKD)的首字母缩略词中,字母 K 表示“compatibility”(兼容性)。
一般使用 NFC 保存字符串。后两种转换会有格式损失,但在搜索中却很有用。
还有就是大小写折叠,不仅仅是忽略大小写,而且把其他一些符号改变。书上还介绍了一规范化——把变音符号去掉。
对 Unicode 字符的排序,可使用 key 关键字参数获得我们想要的排序结果。之后就是 Unicode 数据库,里面保存了各种关于 Unicode 的消息。
最后是双模 API,同一函数能接受字符串和字节进行操作。
书上很多问题都没怎么遇到,也没想到会这么复杂,不过相信以后会接触到的。慢慢消化吧。