||
在python编写中,大家经常见到一下的几种情况:
b'Hello,world!'
或
r'\s\d{3,6}'
在或
u'生日快乐'
第一种情况b
python3.x里默认的str是(py2.x里的)unicode, bytes是(py2.x)的str, b”“前缀代表的就是bytes ;
python2.x里, b前缀没什么具体意义, 只是为了兼容python3.x的这种写法。
第二种情况r
常用于正则表达式或文件绝对地址等,该字母后面一般一般接转义字符,有特殊含义的字符。所以,要使用转义字符,通常字符串前面要加r。
第三种情况u
u后面的字符串表示使用Unicode编码,因为中文也有对应的Unicode编码,所以常用于中文字符串的前面,防止出现乱码。
python3字符串编码总结-str(unicode)_bytes
概述:python3中默认对字符串采用的是unicode编码的str类型来表示,任一字符用两字节表示。而bytes类型,其本质是比特流,即"10110011 00110011 xxxxxxxx",bytes表示的比特流是什么含义由不同的编码格式确定,比如如果是ascii编码,那么每8位表示一个字符。python3在进行文件操作和网络通信都是使用bytes进行的,所以对于str类型要进行编码后才能写入文件或网络。
1. 字符串的编码形式
字符串的编码最一开始是ascii,使用8位二进制表示,因为英文就是编码的全部。后来其他国家的语言加入进来,ascii就不够用了,所以一种万国码就出现了,它的名字就叫unicode,unicode编码对所有语言使用两个字节,部分汉语使用三个字节。但是这就导致一个问题,就是unicode不仅不兼容ascii编码,而且会造成空间的浪费,于是uft-8编码应运而生了,utf-8编码对英文使用一个字节的编码,由于这样的特点,很快得到全面的使用。
2. 字节码bytes
python3中bytes用b’xxx’表示,其中的x可以用字符,也可以用ascii表示。python3中的二进制文件(如文本文件)统一采用字节码读写。
2.1. 字节码的使用举例
2.2. 字节码的修改
要修改bytes中的某一个字节必须要将其转换为bytearray以后才可以。如下:
2.3. 字节码bytes与字符之间的关系
将表示二进制的bytes进行适当编码就可以变为字符了,比如utf-8或是gbk等等编码格式都可以。(所以我个人的理解就是:有utf-8格式的bytes,也有gbk格式的bytes等等)。
3.字节码bytes与unicode编码的相互转换
3.1 python2与python3字符串编码的区别
python3默认使用的是str类型对字符串编码,默认使用bytes操作二进制数据流,两者不能混淆!!
Python3有两种表示字符序列的类型:bytes和str。前者的实例包含原始的8位值,后者的实例包含Unicode字符。Python2也有两种表示字符序列的类型,分别叫做str和Unicode,与Python3不同的是,str实例包含原始的8位值;而unicode的实例,则包含Unicode字符。
3.2 bytes与str类型的相互转换
str(unicode)类型是基准!要将str类型转化为bytes类型,使用encode()内置函数;反过来,使用decode()函数。使用实例如下:
>>>oath = ‘我爱妞’ >>>type(oath) <class 'str'> >>>oath = oath.encode(‘utf-8’) >>> type(oath) <class 'bytes'> >>> oath b'\xe6\x88\x91\xe7\x88\xb1\xe5\xa6\x9e' >>> oath = oath.decode() >>> oath '我爱妞'
为了方便开发者的使用,可以编写两个helper函数,第一个是无论输入的是str还是bytes类型都输出str。
def to_str(bytes_or_str): if isinstance(bytes_or_str, bytes): value = bytes_or_str.decode('utf-8') else: value = bytes_or_str return value # Instance of str123456
另外,还需要编写接受str或bytes,并总是返回bytes的方法:
def to_bytes(bytes_or_str): if isinstance(bytes_or_str, str): value = bytes_or_str.encode('utf-8) else: value = bytes_or_str return value # Instance of bytes
3.3 文件的编码
with open(‘sun.bin’,’wb’) as f: f.write(b‘sui’)
在open文件的时候用“wb”方式打开,即二进制写的方式,所以下面的write函数对象用的是bytes类型的b’sui’,这个时候如果使用f.write(‘sui’)就会出错的。
(注:对打开文件的路径的操作,使用os模块的getcwd方法以及chdir方法)
3.4 网页的编码
>>>import urllib.request >>>response = urllib.request.urlopen(‘http://www.baidu.com’) >>>html = response.read() >>>type(html) <class 'bytes'>
所以要正常显示的话,就要使用decode()方法了。
【参考】
https://www.cnblogs.com/yanglang/p/7416889.html
https://blog.csdn.net/Setul/article/details/52203894
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-26 12:45
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社