我正在使用一个返回“字节字符串”( bytes
)的库,我需要将其转换为字符串。
这两件事之间真的有区别吗?它们有什么关系,我该如何进行转换?
原文由 Sheldon 发布,翻译遵循 CC BY-SA 4.0 许可协议
计算机唯一可以存储的是字节。
要在计算机中存储任何东西,您必须首先对其 _进行编码_,即将其转换为字节。例如:
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 许可协议
2 回答5.2k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
2 回答893 阅读✓ 已解决
1 回答1.8k 阅读✓ 已解决
假设 Python 3(在 Python 2 中,这种差异的定义不太明确)- 字符串是字符序列,即 unicode 代码点;这些是一个抽象的概念,不能直接存储在磁盘上。毫不奇怪,字节串是字节序列—— 可以 存储在磁盘上的东西。它们之间的映射是一种 _编码_——有很多这样的编码(并且可能有无限多)——你需要知道哪种适用于特定情况才能进行转换,因为不同的编码可能映射相同的字节到不同的字符串:
一旦知道要使用哪一个,就可以使用字节串的
.decode()
方法从中获取正确的字符串,如上所示。为了完整起见,字符串的.encode()
方法走相反的路: