0

我已经在这里阅读了答案。我了解字节流是什么(1 和 0 的流),编码是(从该流到我们人类理解的字符的映射)和解码是(从字符到相应字节的反向映射)。

我仍然无法在脑海中调和整个概念。在 RAM 中,我们已经将所有内容都仅作为字节。而且我猜我的解释器本质上是在使用一些解码方案来向我展示与该字节流对应的字符。那么我们在保存到磁盘之前必须进行编码是什么意思呢?如果我的解释器使用“utf-8”向我们显示我正在输入的文本,并要求它使用“cp-1252”保存该文本,我是否更改了底层字节流?

4

2 回答 2

0

有不同的方式来看待它。

在路上:“你好,世界!” 可以用不同的方式编码。你想要字符串的语义:所以是称呼和目标。但是,如果您保存到 UTF-8 文件,您将有不同的值,例如在 UTF-16LE 文件中或在 EBCDIC 编码中。

例如A,在 ASCII 编码中是 65,但在 EBCDIC 编码中是 193(例如被许多 IBM 大型机使用),在 UTF-16 编码中是 0 65(或 65 0)。等等所以当你保存一个数字时,你需要指定编码(正如读者所期望的那样,所以它可能取决于文件格式)。

但一种语言的库也无法处理所有编码(对于所有函数)。通常最好使用标准库进行解码,然后在数据应该输出时进行编码。所以你只需要实现编码和解码(例如对于 EBCDIC),而不是所有的排序、大写/小写处理、is_digits、is_symbol 等。

将语义与实际值分开是标准做法。或者用逻辑显示。如果你是一个控制狂,你可以在不解码值的情况下做所有事情。但它很容易出错,而且你应该知道很多细节,很少有人想知道。

另一个例子,你需要知道你的数据/字符串的真实值吗?你有一个数字,它是小端编码还是大端编码?或者作为一个浮点数(例如 JavaScript)。我们只知道,当我们保存数据时(例如在互联网上发送,我们需要一种方式来告诉排序。或者在保存图像时:我们告诉排序,所以在某些机器上,当读取一个大文件时,字节将被交换数字)。

或者另一个例子:你自拍。您有一个图像,但您可以将其保存为 PNG 文件或 JPEG 文件:您将获得非常不同的文件,具有不同的值。但是你知道编码(幸运的是,对于这样的图像文件,第一个字节描述了格式,然后是关于编码的少量​​数据)。对你来说,知道这是你的形象就足够了。但是你认为计算机会占用这两种格式的字节吗?可能没有。当您读取图像时,您将在内存中转换为不同的编码(但您可能不需要关心它):通常是 RGB(或 RGBA)格式,但每个通道有多少位,或者是否有一些颜色渲染(来自profiles),你不知道【JPEG另存为YCC】

Python 有更严格的语义视图:你不知道 Python 将如何编码字符串。它可能是 8 位:ASCII/Latin1,或 16 位 (UCS2),或 32 位 (UTF-32)。它根据存储字符串的最有效方式动态处理内部编码。您仍然可以获得一个代码点、每个字符的一个以及许多字符串/字符函数。就在你编码一个字符串时,你有一个固定的数字序列。在字符串方面,您真的不知道字符串在内存中是如何表示的。因此,这将 Unicode 的两个不同部分清楚地分开:语义值(所有字符的描述)和编码/解码(如何以字节表示值)。

当您在 Python 中处理字符串时,您应该只关心语义。实现(以及内存中字符串的物理布局)不是你的事,Python 可以改变它。(它改变了它)。

但是用你的例子:

您可能不会得到太多,因为最近的标准化:ASCII 几乎成为最常见的拉丁字母和符号的唯一编码。Latin-1 与 ASCII 兼容,只是从 7 位扩展到 8 位。“Windows ANSI”使用 Latin-1 并在未分配的部分添加字符。基于 Latin-1 的 Unicode(前 256 个字符)。因此,您可能会看到一个具有固定数字(或不可用)的字符,但这不是规则,在早期的 Windows 中也是如此。

因此,您的cp-1252适用于与 UTF-8 兼容的大多数字符(但很少有字符)。但是如果你使用其他编码,你应该做很多转码(从一种编码改变到另一种)。但通常你只是在保存时这样做:你保留内部编码,但你做一个要保存的副本。

于 2020-10-20T08:35:58.300 回答
0

一个字节是 8 位,无论是在 RAM 中、磁盘上还是在网络上。

位是计算机数据的“原子”。一个字节就是“分子”,只不过字节只有一种。

比特是计算机中最小的信息单位。通常说它代表 0 或 1,或 OFF 或 ON。

您是否将字节“解释”为数字(0 到 255)、带符号的数字(-128 到 +127)、“ascii”字符(如我正在输入的字符)取决于您(或计算机)所做的与字节。或者一个字节可以是一个更大的数字的一部分,一个需要几个字节来表示的数字。

因为有太多的“字母”或“字符”(尤其是中文),为了适应一个字节,还有一个“字符”可能由多个字节组成的附加概念。UTF-8 是当今的主要标准。Giacomo 讨论了几种不太常见的编码,这些编码说明了一个字节(或多个字节)表示什么“字符”。请记住,每个字节由 8 位组成。

英文字母和数字以及一些标点符号以字节表示(编码),其方式与 Ascii、Latin1、cp-1252 和 UTF-8(以及其他一些编码)相同。但是一旦你进入欧洲重音字母,编码就会不同。

您可能听说过的一个常见事情是将一个字节表示为两个十六进制数字。

于 2020-10-20T20:04:06.137 回答