Python和C的字符串
在Python 3 中,bytes单独作为一个类型,不再和str类型混在一起。关于字符串和字节,我想先回顾下C/C++
在C/C++中,字符串是由char数组构成,每个元素是一个Char数据结构,数组的结尾是' '空字符。
- char是默认的unsigned的整型数据, 用于存储英文字符和小的整数(取值是0-255)。
- ASCII是char的子集,因此char很好存储英文字母, 满足存储英文字符的需求。
在C/C++中,int是整型的数据结构。而Python的int被设计成类,它有自己的属性和方法。这是Python和C/C++截然不同的地方。
同样在C/C++中的char整型,到了Python中,相应的是bytes类。我们可以这样说:Python中的Bytes类,本质上是C/C++中的char数组。
如下是几个demo。
1. 对比bytes和string
对于字节:
my_bytes = b'Python'
print(type(my_bytes))
print(my_bytes[0])
print(my_bytes[0] + 1)
# 结果:
<class 'bytes'>
80
81
对于字符串:
my_string = 'Python'
print(type(my_string))
print(my_string[0])
print(my_string[0] + 'y')
# 结果:
<class 'str'>
P
Py
结论:
- 在Python中,bytes和string都是序列类型,它们允许分片操作。
- 但是bytes中的+号是运算符,而string中+号是连接符。
从这个意义上,Python仍然保持着与C的一致性。在C中,bytes是char数组,string是以空字符结尾的char数组。+号对于前者是运算,对于后者是连接。
2. 如何用bytes表示125-255的整数型
a_num = b'xff'
print(type(a_num[0]))
print(a_num[0])
# 结果:
<class 'int'>
255
结论:bytes类是序列,其中每个元素都是int类
字符串----encode--> 转到特定编码的的字节, 字节------decode--> 原生的字符串
字符串有decode方法,而字节是有encode方法。
3.关于decode和encode
str对象有encode方法,而bytes对象有decode方法,如何理解呢?
字符串(以某种编码存储的)----encode--> 转成特定编码的的字节,
字节(被编码的字节)------decode--> 原生的字符串。
name = '你好' # 此时"你好"是UTF-8编码存储的字符串
nameBytes = name.encode('utf-16') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr)
# 结果:
你好
255 254 96
你好
UTF-8
编码的字节序列,总是以0xEF
0xBB
开头,所以打印前两位出来是的:228,189UTF-16
编码的字节序列,总是以0xEF
0xBB
开头,所以打印前两位出来是的:255,254
因为一种格式编码的字符串可以被转换成其它的编码,所谓encode,本质就是编码的转换。python3中字符串默认是UTF-8
编码格式,你可以把它encode成其它格式进行存储,当然,如果你要读取它,必须要以相应的编码格式去解码。
做个游戏
name = '你好'
nameBytes = name.encode('utf-8') # 字节
nameStr = nameBytes.decode('utf-16') # 字符串
print(name)
print(nameBytes[0], nameBytes[1], nameBytes[2])
print(nameStr)
# 结果:
你好
228 189 160
뷤�붥
我把中文“你好”用utf-8编码,然后用utf-16去解码,得到韩文--- 뷤�붥