字符串:文本字符串和字节字符串
数据以字节存储,而ASCII与Unicode的字符集负责使用字节数据来生成对应的文本
python 定义了两个函数(chr(接受一个字符返回在ASCII中的整数)和ord(接受一个整型返回在ASCII中对应的字符)),用于在单整型字节和字符之间的转换
字符集
ASCII:1Bytes代表一个字符,1Byte=8bit,8bit可以代表2**(8-1)=256个字符
GBK:2bytes代表一个字符(中文,中国自己的编码)
Unicode:2bytes代表一个字符,(通用的编码,对于全是英文的文本,会浪费一倍的存储空间 )
UTF-8:1Bytes代表一个英文字符,3Bytes代表一个中文字符
python3:
文本字符串类型(使用Unicode存储)被命名为str,字节字符串类型被命名为bytes.
实例化一个字符串会得到一个str实例,在文本前面加b,会得到一个bytes实例
str与bytes之间的转换:
encode:str→bytes(可接受一个代表特定编码的字符串作为参数,eg:encode(“utf-8”))
decode:bytes→str(也可接受参数,但应根据被编码时的编码进行解码)
在python3中,需显性使用str.encode和bytes.decode。
而在字符串和字节串共同操作时,可使用%用于字符串的格式化
如图,将文本字符串插入到字节字符串时,引发异常
而将字节字符串插入到文本字符串时可以生效。
操作符接受的是b“foo”的值,该值是一个bytes对象的实例,而bytes对象包含__str__方法,它返回文本字符串"b“foo”".
python2
文本字符串被命名为Unicode,字节字符串被命名为str
实例化一个字符串会返回一个str实例(字节字符串),若想得到一个文本字符串,则需要加前缀u.
而在python2 中,会在文本字符串和字节字符串之间尝试进行隐式转换。机制是:当解释器遇到一个混合的字符串时,解释器会首先将字节字符串转换为文本字符串,然后对文本字符串执行操作。
python2 定义了sys.getdefaultencoding方法,用于为文本字符串和字节字符串之间隐式转换提供默认编码
encode:str→Unicode
decode:Unicode→str(与python3相反。)
例如:
text=u"\u03b1 is for alpha"
text.encode(“utf-8”)#隐式转换为str(字节字符串),然后使用encode转换为文本字符串
text.encode(“utf-8”).encode(“utf-8”)#报错,相当于text.encode(“utf-8”).decode(“ascii”).encode(“utf-8”)
统一的方法:
①定义了一个__future__模块,会遵守python3的约定(from future import unicode_literals)用于python2.6之后的版本
②使用six(以编写能够运行在python2与python3下的模块为中心的库,文本字符串:six.text_type,字节字符串:six.binary_type)
读取文件
python3
①在python3打开文件会得到文本字符串,但是在无法得知编码的情况该如何解码?
在python3中,决定使用哪种编码取决于系统,可使用函数locale.getpreferredencoding知道,首选的编码基于底层系统的运行方式。
②那么在不同系统中打开文件该如何解决编码解码?
1>、指定编码(with open(filename,“r”,encoding==“utf-8”)as f)
2>、读取字节(with open (filename,“rb”)as f)
python2
python2打开文件会得到字节字符串,可使用decode获取文本字符串,open函数没有提供encoding关键字参数
*解决方法:
①、声明所使用的时哪一种编码方式(# __ coding: utf-8_*_)
python2期望使用ASCII编码,python3期望使用utf-8
②、不触发错误
encode与decode都有第二个可选参数errors,参数类型为字符串,默认值为strict
另外两种错误处理程序:ignore与replace
ignore:跳过所有编码无法解码的字节
replace:将无法解码的字符转换为一个占位字符(替换字符的数量与实际字符数不一致)
python编码(字符串)
最新推荐文章于 2023-05-26 11:43:30 发布