Python 字符串和字节字符串之间的区别是什么?

Python 字符串和字节字符串之间的区别是什么?,python,string,character,byte,Python,String,Character,Byte,我正在使用一个返回字节字符串的库,我需要将其转换为字符串 虽然我不确定区别是什么——如果有的话 假设Python3(在Python2中,这种差异定义得不太明确)-字符串是一个字符序列,即;这些是一个抽象概念,不能直接存储在磁盘上。字节字符串是一个字节序列,可以存储在磁盘上。它们之间的映射是一种编码——其中有很多(可能有无限多个)——为了进行转换,您需要知道在特定情况下应用哪种编码,因为不同的编码可能会将相同的字节映射到不同的字符串: >>> b'\xcf\x84o\xcf\x8

我正在使用一个返回字节字符串的库,我需要将其转换为字符串

虽然我不确定区别是什么——如果有的话

假设Python3(在Python2中,这种差异定义得不太明确)-字符串是一个字符序列,即;这些是一个抽象概念,不能直接存储在磁盘上。字节字符串是一个字节序列,可以存储在磁盘上。它们之间的映射是一种编码——其中有很多(可能有无限多个)——为了进行转换,您需要知道在特定情况下应用哪种编码,因为不同的编码可能会将相同的字节映射到不同的字符串:

>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-16')
'蓏콯캁澽苏'
>>> b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'.decode('utf-8')
'τoρνoς'
一旦知道要使用哪一个,就可以使用字节字符串的
.decode()
方法从中获取正确的字符串,如上所述。为了完整性起见,字符串的
.encode()
方法与此相反:

>>> 'τoρνoς'.encode('utf-8')
b'\xcf\x84o\xcf\x81\xce\xbdo\xcf\x82'

计算机只能存储字节

要在计算机中存储任何内容,必须首先对其进行编码,即将其转换为字节。例如:

  • 如果要存储音乐,必须首先使用
    MP3
    WAV
    等对其进行编码
  • 如果要存储图片,必须首先使用
    PNG
    JPEG
    等对其进行编码
  • 如果要存储文本,必须首先使用
    ASCII
    UTF-8
    等对其进行编码
MP3
WAV
PNG
JPEG
ASCII
UTF-8
都是编码的示例。编码是以字节表示音频、图像、文本等的格式

在Python中,字节字符串就是:一个字节序列。它不是人类可读的。在引擎盖下,所有内容都必须转换为字节字符串,然后才能存储在计算机中

另一方面,字符串(通常称为“字符串”)是一个字符序列。它是人类可读的。字符串不能直接存储在计算机中,必须先对其进行编码(转换为字节字符串)。可以通过多种编码将字符串转换为字节字符串,例如
ASCII
UTF-8

'I am a string'.encode('ASCII')
上面的Python代码将使用编码
ASCII
对字符串
'I am a string'
进行编码。上述代码的结果将是一个字节字符串。如果您打印它,Python将把它表示为
b'I am a string'
。但是,请记住,字节字符串不是人类可读的,只是当您打印它们时,Python会从
ASCII
对它们进行解码。在Python中,字节字符串由
b
表示,后跟字节字符串的
ASCII
表示

如果您知道用于编码的编码,则可以将字节字符串解码回字符串

b'I am a string'.decode('ASCII')
上述代码将返回原始字符串
“我是字符串”

编码和解码是反向操作。在写入磁盘之前,必须对所有内容进行编码,并且在人类读取之前必须对其进行解码。

来源:

从根本上说,计算机只处理数字。它们通过为每个字母指定一个数字来存储字母和其他字符

Unicode为每个字符提供一个唯一的数字,无论平台是什么,程序是什么,语言是什么

因此,当计算机表示字符串时,它通过其唯一的Unicode编号查找存储在字符串计算机中的字符,这些数字存储在内存中。但您不能直接将字符串写入磁盘或通过其唯一的Unicode数字在网络上传输字符串,因为这些数字只是简单的十进制数字。您应该将字符串编码为字节字符串,例如
UTF-8
UTF-8
是一种字符编码,能够对所有可能的字符进行编码,并将字符存储为字节(看起来像)。因此,编码字符串可以在任何地方使用,因为几乎所有地方都支持
UTF-8
。当您从其他系统打开以
UTF-8
编码的文本文件时,您的计算机将对其进行解码,并通过其唯一的Unicode编号显示其中的字符。当浏览器从网络接收到编码为
UTF-8
的字符串数据时,它会将数据解码为字符串(假定浏览器处于
UTF-8
编码中)并显示该字符串

在python3中,可以将字符串和字节字符串相互转换:

>>> print('中文'.encode('utf-8'))
b'\xe4\xb8\xad\xe6\x96\x87'
>>> print(b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8'))
中文 

一句话,字符串用于显示给人类在计算机上阅读,字节字符串用于存储到磁盘和数据传输。注意:我将详细阐述我对Python 3的回答,因为Python 2的寿命即将结束

Python 3中的

bytes
由8位无符号值序列组成,而
str
由表示人类语言文本字符的Unicode码点序列组成

>#字节
>>>b=b'h\x65llo'
>>>类型(b)
>>>名单(b)
[104, 101, 108, 108, 111]
>>>印刷品(b)
b‘你好’
>>>
>>>#str
>>>s='nai\u0308ve'
>>>类型
>>>名单
['n'、'a'、'i'、'.'、'v'、'e']
>>>印刷品
奈维
尽管
bytes
str
的工作方式似乎相同,但它们的实例彼此不兼容,即
bytes
str
实例不能与
+
等运算符一起使用。此外,请记住,比较
字节
str
实例是否相等,即使用
=
,即使它们包含完全相同的字符,也将始终计算为

连接 >>>你好+再见#这是可能的 b'hibye' >>>“你好”+“再见”#我是als
>>> 'š'.encode('utf-8')
b'\xc5\xa1'
>>> bin(int(b'\xc5\xa1'.hex(), 16))
'0b1100010110100001'
11000101 10100001
   ^^^^^   ^^^^^^
   00101   100001
>>> chr(int('101100001', 2))
'š'
casefold
encode
format
format_map
isdecimal
isidentifier
isnumeric
isprintable
decode
fromhex
hex