python反恐精英代码_Python模块codecs-字符串编码和解码
模块 codecs 提供接⼝转变数据编码,它常常和 Unicode 编码使⽤,但是也可以和其他编码⼀起使⽤。
Unicode 编码
Python 解释器 CPython 3.x 提供了两种字符串类型: text 和 byte string。bytes 是⼀个8位的字节序列,str是⽂本字符串,内部是⼀个 Unicode code points 序列。code point 值可以是2个或者4个字节,根据编译 Python 时给定的选项确定,所以说 Unicode 编码的字节长度是可变的。
当 str 打印时,根据内部的字节编码类型,把内部的 code point 转换为显⽰的字符,所以 Unicode 的数据需要根据字节编码转换为内部显⽰的字符。使⽤字节序列的 bytes 和 code point 是不⼀样的,它没有这种情况。
Unicode 最常⽤的编码类型是 UTF-8 和 UTF-16,它使⽤⼀个字节或者2个字节的序列表⽰每个 code point。也包括其他的编码,由其他语⾔使⽤,他们不只使⽤2个字节表⽰ code point。
编码
为了更好的理解编码类型,下⾯的例⼦使⽤不同的编码打印了相同的数据。⾸先定义了⼀个函数 to_hex() 返回数据的⼆进制表⽰。
执⾏:
unicode编码转换二进制函数 to_hex() 第⼀个参数是要打印的⼆进制数据,第⼆个参数指定每次打印多少个字节,字节之间按空格分隔。
下⾯的例⼦分别使⽤ utf-8 和 utf-16 编码同⼀个字符串,然后打印字节数据。
执⾏:
⽂件
编码和解码对于 IO 操作是⾮常重要的,读取和写⼊都必须要知道数据的编码。例如写⼊⼀个⽂件,Socket或者其他流,数据必须要有正确的编码。通常从⼀个字节流转为内部的字符串表⽰叫做解码,把内部数据转换为特定的字节流叫做编码。模块 codecs 提供了⽅法⾃动解码和编码数据,所以我们写应⽤时,常常可以忽略这些细节。
codecs 模块的 open() 函数可以指定特定的编码和⽂件⼯作。
执⾏:
本例中,使⽤命令⾏传⼊编码类型,然后使⽤ codecs.open() 函数写⼊指定编码的数据,最后打印了不同编码类型的数据。
字节顺序
类似 UTF-8 和 UTF-16 这种多字节的编码类型,常常在多个计算机之间传递数据的时候,需要注意字节顺序的问题。因为不同的计算机系统使⽤的字节顺序有可能不⼀样。这样的特性通常称为 endianness,通常会根据硬件结构,操作系统,应⽤开发者来决定。
多字节的编码类型根据字节开头的 BOM(byte-order marker)来确定字节顺序,codecs 定义了多个常量标识不同编码的 BOM 值。
执⾏:
字节顺序会由 codecs 模块⾃动确定,你也可以在编码的时候显⽰的指定。下⾯不使⽤系统的字节顺序,⽽使⽤⾃定义的字节顺序写⼊数据到⽂件。
执⾏:
本例中,⽂件开头写⼊了 bom marker,当读取⽂件的时候,⽂件内容多输出了 bom marker。要想只返回⽂件内容,读取的时候需要指定编码类型。
执⾏:
当不指定编码类型时,默认使⽤系统的内置编码类型。如果内置编码类型和⽂件实际的类型不⼀致,则触发异常 UnicodeDecodeError。执⾏:
错误处理
当读取和写⼊⽂件时,使⽤正确的编码类型是⾄关重要的。如果读取⽂件时,指定的编码类型错误,则触发异常,就和上⾯遇到的⼀样。当使⽤错误的编码类型,写⼊数据到⽂件时,数据就会丢失。
codecs 提供了下⾯5种选项处理从字符串编码和从字节流解码遇到的问题。strict 如果数据转换失败,则触发异常
replace 把不能编码的数据替换掉
ignore 忽略不能编码的数据
xmlcharrefreplace XML 字符
backslashreplace 转义序列
下⾯的例⼦,试图把⼀个 Unicode 编码的数据写⼊到 ASCII 流的⽂件中,触发不同的错误处理⽅式。
执⾏:
正如上⾯所说,错误处理选项使⽤ strict 触发异常,replace 替换不能编码的字符,ignore 忽略。
编码转换
虽然⼤部分程序都使⽤ str 处理数据,⽽编码解码数据只是 IO 的⼀部分。有时候也需要转换编码格式。EncodedFile() 接收⼀个字节流和两个编码参数,把数据从⼀个编码类型转换为另⼀个。
执⾏:
本例把 utf-8 编码类型转换为 utf-16。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论