字符串和字节串有什么区别?

新手上路,请多包涵

我正在使用一个返回“字节字符串”( bytes )的库,我需要将其转换为字符串。

这两件事之间真的有区别吗?它们有什么关系,我该如何进行转换?

原文由 Sheldon 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 543
2 个回答

假设 Python 3(在 Python 2 中,这种差异的定义不太明确)- 字符串是字符序列,即 unicode 代码点;这些是一个抽象的概念,不能直接存储在磁盘上。毫不奇怪,字节串是字节序列—— 可以 存储在磁盘上的东西。它们之间的映射是一种 _编码_——有很多这样的编码(并且可能有无限多)——你需要知道哪种适用于特定情况才能进行转换,因为不同的编码可能映射相同的字节到不同的字符串:

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

原文由 lvc 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

  • 如果要存储音乐,必须先使用 MP3WAV 等对其进行 _编码_。
  • 如果要存储图片,必须先使用 PNGJPEG 等对其进行 _编码_。
  • 如果要存储文本,必须先使用 ASCIIUTF-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')

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

编码和解码是逆运算。一切都必须在写入磁盘之前进行编码,并且在人类可以读取之前必须对其进行解码。

原文由 Zenadix 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题