python字符串和字节串的区别

文章发布于 2023-05-20

什么是字符串和字节串?

  • 字符串,就是我们平时使用的字符串,属于str 字符串类型。通过encode()方法编码为字节串。
  • 字节串,二进制字符串,属于bytes字节串类型。通过decode()解码为字符串。

字符串和字节串的使用场景

字符串是面向的人,字节串面向的计算机。下面介绍一下字符串和字节串的使用场景:

  • 从文件或外部存储读取字节串内容时,将字节串通过decode()解码为字符串。
  • 将字符串通过encode()编码为字节串之后,写入文件或其他外部存储。

比如,在给txt文件写入一个中文时会发现,写入的中文会乱码。为什么会乱码呢?因为普通字符串是不能直接存储。正确的做法是需要将普通字符串编码为字节串之后存储到文件或外部存储。

没有指定编码,出现乱码。

with open('out.txt','w') as f:
    f.write("hello 前端编程")
    
# 没有将普通的字符串转换为字节串去存储,所以出现了下面的乱码。
hello ǰ�˱��

指定编码之后,正确输出

# encoding="UTF-8"
with open('out.txt','w',encoding="UTF-8") as f:
    f.write("hello 前端编程")
    
# 指定编码为UTF-8
hello 前端编程

编码/解码

字符串转换字节串

使用encode() 将字符串转换为字节串,并指定编码格式为UTF-8,默认为UTF-8。

>>> str = 'hello 前端领地'
>>> str.encode('UTF-8')
b'hello \xe5\x89\x8d\xe7\xab\xaf\xe9\xa2\x86\xe5\x9c\xb0'

使用字面量字节串b'ASCII'

使用b'ascii' 转换字节串,只能转换ascii码表里组成的字符串。

>>> en_str1 = b'hello world'
>>> en_str2 = 'hello world'.encode()
>>> en_str1
b'hello world'
>>> en_str2
b'hello world'
>>> en_str1 == en_str2
True
>>> en_str2 = 'hello world'.encode('gbk')
>>> en_str1 == en_str2

转换非ascii码表里的字符会报错

>>> en_str = b'hello 前端领地'
  File "<stdin>", line 1
    en_str = b'hello 前端领地'
                          ^
SyntaxError: bytes can only contain ASCII literal characters.

前端领地 不属于ascii 码表里的,出现上面报错内容SyntaxError: bytes can only contain ASCII literal characters.

字节串转换字符串

使用decode() 将字节串解码为字符串,并指定格式为GBK ,默认为UTF-8。

>>> en_str = str.encode('GBK')
>>> en_str
b'hello \xc7\xb0\xb6\xcb\xc1\xec\xb5\xd8'
>>> en_str.decode('GBK')
'hello 前端领地'

注意:字符串使用的GBK编码的,解码也必须使用GBK解码。否则会出现以下错误

上面字节串en_str是GBK编码的,下面将en_str使用UTF-8解码会报错。编码和解码要使用同一种编码方式。

>>> en_str.decode('UTF-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb6 in position 8: invalid start byte

字符串和字节串不相等

>>> 'hello'== b'hello'
False