python中Unicode 和字节字符串

Unicode 和字节字符串

字符串编码方式:

  • ASCLL标准

    • 每个字符存储在一个8位的字节中(实际上,只有其中的7位真正用到)

    • ord给出了一个字符的整数代码值

    • chr针对一个给定的整数代码值返回其字符

  • 字节和字符串之间的来回转换:

    • 编码 是根据一个想要的编码名称,把一个字符串翻译为其原始字节形式

    • 解码 是根据其编码名称,把一个原始字节串翻译为字符串形式的过程

  • UTF-8编码:

    • 通用转换格式,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的字节数(连续的1后也固定了为0,不参与),其余各字节均以10开头(序列中的每个字节的值在128到255之间).剩余的位数顺序抽取出来表示Unicode码

python字符串类型:

  • str 表示Unicode文本(8位的和更宽的)。

    扫描二维码关注公众号,回复: 3184035 查看本文章
    • 定义为一个不可改变的字符序列(不一定是字节)

    • str函数或字符串常量形式,’x x x’ 、 “x x x” 和三引号字符串块,都产生一个 str

    • bytes.decode() 和 str(B, encoding=’ascii’) 把raw bytes转换为其字符串str形式,encoding参数可选,但加上才能正则实现转换,否则只是打印带b前缀的字符串

  • bytes 表示二进制数据。

    • 定义为一个8位整数的不可变序列,表示绝对的字节值

    • bytes类型支持几乎str类型所做的所有相同操作(不包括字符串格式化)

    • bytes函数或字符串常量前面添加一个b或B(open中只能b),则会创建一个 bytes

    • str.encode([‘ascii’]) 和 bytes(S, encoding=’ascii’)把一个字符串转换为其raw bytes形式 (bytes还可以接受可迭代的整数表示的字节值,例如bytes([97, 98, 99]))

  • bytearray ,是一种可变的 bytes 类型

    • bytearray是bytes类型的一个变体,它是可变的并且支持原处修改。

    • 支持 s t r 和 b y t e s 所支持的常见的字符串操作,以及和列表相同的很多原处修改操作(例如, append 和 extend 方法,以及向索引赋值)

    • 通过调用 bytearray(S, encoding=”) 函数对str来创建,bytearray(b’bytes’)对bytes对象来创建

    • 索引复制和append等改变一个 字节的操作需要int参数(c[0]=45,c.append(ord(‘f’))),改变多个字节的操作需要bytes对象参数(c.extend(b’sss’))

文本和二进制文件:

  • 文本文件

以文本模式打开的时候,读取其数据会自动将其内容解码(每个平台一个默认的或一个提供的编码名称),并且将其返回为一个str,写入会接受一个str ,并且在将其传输到文件之间自动编码它。文本模式的文件还支持统一的行尾转换(单个的 ‘\n’ 字符,windows会将其转化为\r\n)和额外的编码特定参数(encoding).文本文件也负责阅读和写入在某些Unicode编码方案中存储文件开始处的字节顺序标记(Byte Order Mark,BOM)

  • 二进制文件

二进制模式打开一个文件的时候,读取其数据不会以任何方式解码它,而是直接返回其内容raw并且未经修改,作为一个bytes对象;写入类似地接受一个bytes对象或bytearray 对象,并且将其传送到文件中而未经修改。

编码:

  • 除非在源文件中给定一个编码声明,否则默认为UTF-8

  • 转义字节:

    • “\xNN” :十六进制字节值转义

    • “\uNNNN” :Unicode转义,4个十六进制位以编码1个2字节(16位)字符码

    • “\UNNNNNNNN”: Unicode转义,8个十六进制位表示4字节(32位)代码

  • 通过包含一个注释来指明想要的编码,必须作为脚本的第一行或第二行出现:# -*- coding: latin-1 -*-

处理BOM

+ 字节顺序标记(B O M)序列,来指定数据的大小尾方式或声明编码类型

+ EF BB BF 开头的字节流,就知道这是 UTF-8, FEFF,就表明这个字节流是 Big-Endian(大端,高位存储在内存地址的低位) 的;如果收到FFFE,就表明这个字节流是 Little- Endian (小端,低位存储在内存地址的低位)的

+ 具体编码名称(“utf-8-sig”)来迫使Python跳过BOM标记(也可以写入BOM,utf-8不一定有BOM,windows上会默认添加) ,编码名“utf-16/32”忽略BOM,因为它是暗示的(因为所有的UTF-16/32文件都有一个BOM,输出上,数据以平台本地的大小尾方式写入,并且,BOM总是会写的;在输入上,数据根据每个BOM解码,并且BOM总是会去除掉),utf-16-be使不忽略BOM

其他字符串工具

  • re模式匹配:可以用于任何字符串类型的对象—— str 、 bytes 和 bytearray(正则表达式也要转化为相应的类型) ,并且返回同样类型的结果子字符串作为目标字符串。

  • Struct 二进制数据模块:用来从字符串创建和提取打包的二进制数据.B = struct.pack('>i4sh', 7, 'spam', 8)根据二进制类型声明把3个对象打包到一个字符串中(它们创建了一个4字节的整数、一个4字节的字符串和一个两字节的整数).vals = struct.unpack('>i4sh', B)解包二进制数据为python对象

  • pickle 模块:总是创建一个 b y t e s 对象,而不管默认的或传入的“协议”(数据格式化层级),总是要求以二进制模式写入和读取pickle数据

  • XML:Python自身附带一个完整的XML解析工具包,所以它支持SAX和DOM解析模式,此外,还有一个名为ElementTree的包——这是特定于Python的专用于解析和构造XML的一个API。除了基本的解析,开源领域还提供了额外的XML工具,例如XPath、Xquery、XSLT

猜你喜欢

转载自blog.csdn.net/qq_32392853/article/details/81603675