本文主要内容
字符
字节
结构体和内存视图
字符和字节之间的转换——编解码器
BOM鬼符
标准化Unicode字符串
Unicode文本排序
字符
'''字符编码问题是经常困扰python编程人员的问题,我在编写爬虫的过程中也经常遇到这个头疼的事。
从python3开始,明确区分了人类语言(文本字符串)和机器语言(二进制字节),咱们先说文本字符串
开始之前,得对"字符"进行定义:
字符:Unicode字符,从python3的str对象中获取的元素是Unicode字符
字符串:字符串就是一个字符序列(这里对于(一)中内容相呼应)'''
if __name__ == "__main__":#创建字符
s1 = str('a')
s2= 'b's3= u'c'
print(s1, s2, s3) #a b c
此时只用记住在python3中字符就是unicode,也就是str是unicode,这是人类能够看懂的语言。
字节
'''python3中内置有两种基本的二进制序列类型:不可变的bytes和可变bytearray
(1)bytes和bytearray的各个元素是介于0~255(8个bit)之间的整数;
(2)二进制序列的切片始终是同一类型的二进制序列'''
if __name__ == "__main__":#创建bytes 和 bytearray
b1 = bytes('abc你好', encoding='utf8') #关于encode稍后会说,不知道有没有人和我一样总是将编码与解码的方向混淆
print(b1) #b'abc\xe4\xbd\xa0\xe5\xa5\xbd'
b2= bytearray('abc你好', encoding='utf8')print(b2) #bytearray(b'abc\xe4\xbd\xa0\xe5\xa5\xbd')
#切片(提示:序列都可以切片)
print(b1[3:5]) #b'\xe4\xbd'
print(b2[3:5]) #bytearray(b'\xe4\xbd')
#使用列表取值的方法试试
print(b1[3]) #228 此时取出来的就不是字节序列了,而是一个元素
for _ inb1:print(_, end=',') #97,98,99,228,189,160,229,165,189, 这都是8bit的整数
#bytes的不可变 vs. bytearray的可变
#b1[3] = 160 # 报错:'bytes' object does not support item assignment
print(id(b2), b2) #4373768376 bytearray(b'abc\xe4\xbd\xa0\xe5\xa5\xbd')
b2[2] = 78
print(id(b2), b2) #4373768376 bytearray(b'abN\xe4\xbd\xa0\xe5\xa5\xbd')
#将b2转换成字符串看看
print(b2.decode('