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