string和字节string有什么区别?

我正在与一个库返回一个字节string,我需要将其转换为一个string。

虽然我不确定有什么区别 – 如果有的话。

假设Python 3(在Python 2中,这个区别有点不太明确) – 一个string是一个字符序列,即unicode codepoints ; 这些是一个抽象的概念,不能直接存储在磁盘上。 一个字节string是一个字节序列,不出所料, 可以存储在磁盘上。 它们之间的映射是一种编码 – 其中有相当多的(并且无限多)是可能的),并且为了进行转换,您需要知道在特定情况下适用哪种转换,因为不同的编码可能映射相同的字节到另一个string:

>>> 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ς' 

一旦你知道使用哪一个,你可以使用字节string的.decode()方法从上面得到正确的string。 为了完整.encode() ,string的.encode()方法是相反的:

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

计算机唯一可以存储的是字节。

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

  • 如果你想存储音乐,你必须先使用MP3WAV编码
  • 如果要存储图片,则必须先使用PNGJPEG等对其进行编码
  • 如果要存储文本,则必须先使用ASCIIUTF-8等对其进行编码

MP3WAVPNGJPEGASCIIUTF-8编码的例子。 编码是以字节表示audio,图像,文本等的格式。

在Python中,一个字节string就是:一个字节序列。 这是不可读的。 在引擎盖下,所有东西都必须先转换成一个字节string,然后才能存储在计算机中。

另一方面,通常被称为“string”的string是一系列字符。 这是人类可读的。 string不能直接存储在计算机中,必须先编码 (转换为字节string)。 有多种编码可以将string转换为string,例如ASCIIUTF-8

 'I am a string'.encode('ASCII') 

上面的Python代码将使用编码ASCII对string'I am a string'进行编码。 上述代码的结果将是一个字节string。 如果你打印它,Python会将其表示为b'I am a string' 。 但是请记住,字节string不是人类可读的 ,只是Python在打印时将它们解码为ASCII 。 在Python中,一个字节string由b表示,随后是字节string的ASCII表示。

如果您知道用于对其进行编码的编码,则可以将字节string解码回string。

 b'I am a string'.decode('ASCII') 

上面的代码将返回原始string'I am a string'

编码和解码是相反的操作。 在写入磁盘之前,所有东西都必须进行编码,并且必须先解码才能被人读取。

从什么是Unicode :

从根本上讲,电脑只是处理数字。 他们通过为每一个分配一个数字来存储字母和其他字符。

……

Unicode为每个字符提供了一个唯一的编号,不pipe是什么平台,不pipe是什么程序,不pipe什么语言。

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

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

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

总之,string是为了让人们在计算机上阅读,字节串用于存储到磁盘和数据传输。

在Python 2中str由8位值序列组成, unicode由Unicode字符序列组成。 有一件事要记住, strunicode可以和运算符一起使用,如果str只包含7位的ASCI字符。

在Python 3中bytes由8位值序列组成,而str由Unicode字符序列组成。 bytesstr不能和运算符(如>+一起使用。

在Python 2中使用助手函数在strunicode之间转换,在Python 3中在bytesstr之间转换可能是有用的。

 str(b'Text', encoding) 

选中此项: 将字节转换为Pythonstring