文本与字节序列
字符问题
字符的标识:码位,是数字,如 Unicode 标准下 A 的码位是 U+0041
字符的具体表述取决于编码:如 A(U+0041)在 UTF-8 下编码成 \x41
字节概要
(1)bytes 不可变,bytearray 可变
(2)bytes 与 bytearray 各元素是 range(256) 中的一个
(3)切片返回同类型的二进制序列
(4)二进制序列是整数序列,字节的值有三种表现形式:ASCII (空格到~)、\t \r \n \\、十六进制转义
bytes 和 bytearray
-
bytes 与 bytearray 构造方法
最后一种构造方法,使用缓冲类对象创建分两种情况:一是使用 array 创建,会始终复制源对象的字节序列,二是使用 memoryview 对象创建,则允许共享内存(类似 PIL 处理图像)。
构造方法
码位构造 -
struct 与 memoryview
struct 用于从二进制序列中提取结构化信息。即把打包的字节序列转换成 tuple ,或者反向转换。
可作用于bytes、bytearray、memoryview 对象
例子中,header 是一个 memoryview 对象,使用 struct.unpack 传入一定格式,最终转换成 tuple
struct 用法
编解码器(codec,encoder、decoder)
- utf_8 别名:utf-8、utf8、U8
函数 open()、str.encode()、bytes.decode() 中作为参数 encoding 的值 - 纯文本不包含空字符 \x00
- 解决解编码出错一个小技巧:传入参数 errors='replace' 或者 'ignore'
-
统一字符编码侦测包 chardet
chardetect -
BOM(byte-order mark)字节序标记
b'\xff\xfe' 这就是 BOM,此处使用的是小字节序 CPU
小字节序:低位在前,高位在后
这与 utf-16 编码有关,utf-16le 使用小字节序,utf-16be 使用大字节序
有些编辑器如 notepad 在 utf-8 文件中也加了 BOM,自作聪明。
BOM
处理文本文件
不能依赖设备默认编码,打开文件是应明确传入 encoding 参数
encoding
默认使用文本模式,即 TextIOWrapper,我的设备默认编码是 cp936
'rb' 表示二进制模式读取文件,返回 BufferedReader 对象
对象
此处省略了非常多很少见的情况。
杂谈
- 纯文本
所有字节都表示文本字符 ,如 HTML
非纯文本 xsl、png 有些字节表示打包的二进制值,如浮点数,rgb值