gpt4 book ai didi

python - 什么是 Python 字节串?

转载 作者:IT老高 更新时间:2023-10-28 22:08:13 25 4
gpt4 key购买 nike

什么是 Python 字节串?

我能找到的只是关于如何编码为字节串或解码为 ASCII 的主题。或 UTF-8 .我试图了解它是如何在幕后工作的。在普通的 ASCII 字符串中,它是一个数组或字符列表,每个字符代表一个 0-255 的 ASCII 值,因此您可以知道数字代表什么字符。在 Unicode 中,字符的 8 或 16 字节表示可以告诉您它是什么字符。

那么什么是字节串? Python 如何知道哪些字符代表什么?它是如何在引擎盖下工作的?由于您可以打印甚至返回这些字符串,并且它会向您显示字符串表示形式,所以我不太明白...

好的,所以我的意思是肯定在这里被遗漏了。有人告诉我,这是一个 不可变 字节序列,没有任何特定的解释

一个字节序列。好吧,假设一个字节:'a'.encode() 返回 b'a'

足够简单。为什么我可以阅读a

假设我得到 a 的 ASCII 值,通过执行以下操作:printf "%d""'a"

它返回 97。好的,好的,ASCII 字符 a 的整数值。如果我们将 97 解释为 ASCII,比如在 C char 中,那么我们会得到字母 a。很公平。如果我们将字节表示转换为位,我们会得到:

01100001

2^0 + 2^5 + 2^6 = 97。很酷。

那么为什么 'a'.encode() 返回 b'a' 而不是 01100001
如果它没有特定的解释,它不应该返回类似b'01100001'的东西吗?
似乎像 ASCII 一样解释它。

有人提到它在字节串上调用 __repr__,所以它以人类可读的形式显示。但是,即使我这样做:

with open('testbytestring.txt', 'wb') as f:
f.write(b'helloworld')

它会仍然helloworld 作为常规字符串插入文件,而不是作为字节序列... 那么 ASCII 中的字节字符串也是如此吗?

最佳答案

文本是 ASCII 或 UTF-8 或 Windows-1252 是一种常见的误解。 ,因此字节是文本。

文本只是文本,就像图像只是图像一样。将文本或图像存储到磁盘的问题是将数据编码为字节序列。将图像编码为字节的方法有很多:JPEG , PNG , SVG ,以及对文本、ASCII、UTF-8 或 Windows-1252 进行编码的许多方法。

一旦发生编码,字节就是字节。字节不再是图像;他们忘记了他们所指的颜色;尽管图像格式解码器可以恢复该信息。字节同样忘记了它们曾经的字母。事实上,字节根本不记得它们是图像还是文本。只有带外知识(文件名、媒体 header 等)才能猜测这些字节的含义,甚至可能是错误的(以防数据损坏)。

所以,在 Python (Python 3) 中,我们有两种可能看起来相似的类型;对于文本,我们有 str,它知道它是文本;它知道它应该表示哪些字母。它不知道可能是哪些字节,因为字母不是字节。我们还有 bytestring,它不知道是文本还是图像或任何其他类型的数据。

这两种类型表面上是相似的,因为它们都是事物的序列,但是它们序列的事物却大不相同。

在实现上,strUCS-? 的形式存储在内存中,其中 ?是实现定义的,它可能是 UCS-4,UCS-2或 UCS-1,取决于编译时选项和 code points存在于表示的字符串中。


“但是为什么”?

有些看起来像文本的东西实际上是用其他术语定义的。一个非常好的例子是世界上的许多互联网协议(protocol)。例如,HTTP 是一个“文本”协议(protocol),实际上是使用 ABNF 定义的。 RFC 中常见的语法s。这些协议(protocol)以八位字节而不是字符表示,尽管也可以建议使用非正式的编码:

2.3. Terminal Values

Rules resolve into a string of terminal values, sometimes calledcharacters. In ABNF, a character is merely a non-negative integer.In certain contexts, a specific mapping (encoding) of values into acharacter set (such as ASCII) will be specified.

这个区别很重要,因为不可能通过互联网发送文本,你唯一能做的就是发送字节。说“text but in 'foo' encoding”会使格式变得复杂得多,因为客户端和服务器现在需要以某种方式自行找出编码业务,希望以同样的方式,因为它们最终必须以字节的形式传递数据反正。这是双重无用的,因为无论如何这些协议(protocol)很少涉及文本处理,并且只是为实现者提供便利。服务器所有者和最终用户都不会对阅读 Transfer-Encoding: chunked 这个词感兴趣,只要服务器和浏览器都正确理解它。

相比之下,在处理文本时,您并不真正关心它是如何编码的。除了“Heδvy Mλtal άmlaόts”之外,你可以用任何你喜欢的方式表达“Heävy Mëtal Ümlaüts”


因此,不同的类型为您提供了一种表达“此值'表示'文本”或“字节”的方式。

关于python - 什么是 Python 字节串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22824539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com