关于 ASCII 的困惑

Confusion regarding ASCII

我知道 ASCII 是一种字符编码方案,其中一个字节被分配了一个特定的十进制数字、十六进制代码或我们字母表中的一个字母。

我不明白也无法通过 Google 找到的是计算机在幕后如何处理 ASCII。例如,当我写一个包含文本“hello world”的文本文件时,计算机在做什么?它是否将字节保存在内存中以及 ASCII 编码在哪里发挥作用?

计算机存储在磁盘上、通过网络传输或保存在内存中的几乎所有内容都作为 8 位数据块处理,称为字节。

那些字节只是数字。介于 0 和 255 *.

之间的任何值

所以一个 100 字节的文件只是 100 个数字一个接一个。

网络消息也类似,就是一串串数字而已

(我们倾向于将它们抽象化并称它们为“流”之类的东西,因为在某种程度上,从磁盘上的文件读取或接收网络消息通常并不重要,它们基本上只是有限的字节流)。

如果您想将磁盘中的文件显示为文本,则需要将这些数字转换为对人类有意义的数字。因为如果我告诉你一个文件包含字节 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a,那么你很可能真的不知道那是什么意思。 (顺便说一句,那些已经是一种解释的十六进制值,可以等效地说该文件包含十进制字节值 104、101、108,...)

ASCII 是一种如何解释这些数字的模式。它告诉您 0x68(十进制 104)表示字符 h。而那个0x65(十进制101)代表e。如果将该映射应用于这些字节,您将得到 hello world.

只有当计算机想要向用户显示文本时才需要进行解码,因为在内部它并不关心 0x65 是h。因此,如果计算机想要向您显示一些文本,它会查找字母 0x65 代表 h,可能通过它的 Unicode 代码点再次代表, 恰好是 U+0065,然后它查找该字符在字体中的表示方式。然后字体将 U+0065 映射到一些关于如何绘制 h.

的说明

既然我们谈论的是 ASCII,那么应该提到 ASCII 现在实际上并没有被广泛使用,主要是因为它只支持非常有限的一组字符(基本上只够写英文文本,甚至不是全部)。现在更常用的编码是 UTF-8(它具有与 ASCII 兼容的好处,这意味着所有有效的 ASCII 文本也是有效的 UTF-8 文本,但反之则不然)和 UTF-16。其他曾经流行但正在衰落的编码是 ISO-8859-* 系列(它们基本上是 ASCII 的扩展版本,但仍然只支持少量字符)。

* 所以从技术上讲,即使说“那些是 0 到 255 之间的数字”也已经是一种解释。从技术上讲,它们是 8 位,每一位都可以关闭或打开。这些可以解释为无符号数(0 到 255)、有符号数(-128 到 127)、字符(使用类似 ASCII 编码的东西)或任何你想要的东西。但“无符号数”解释是最直接的解释之一。

For instance when I write a text file with the text "hello world", what is the computer doing?

当您按下键盘上的这些键时,键盘和计算机之间的某种协议会让计算机知道按下了哪些键。计算机根据当前 selected 的键盘布局将其转换为字符,例如“h”。它还可能导致您的视频游戏角色向侧面移动或其他任何原因,键与其导致发生的事情之间没有直接联系。但是假设您在文本编辑器中,并且您的计算机将您按下“h”键解释为“输入字母 h”。它现在将其转换为一些内部的 in-memory 字符表示。通常 in-memory 表示将是 UTF-16 编码字节,因此计算机可以表示任何和所有可能的 Unicode 字符。

当您点击文件 → 另存为...时,您 select 以 ASCII 编码存储文件。文本编辑器现在遍历存储在内存中的 UTF-16 字节,并根据 UTF-16/Unicode → ASCII 编码 table 将它们全部转换为等效的 ASCII 字节。这些字节存储在磁盘上。

当您再次打开该文件时,文本编辑器会从磁盘读取这些字节,可能会将它们转换为其内部的 UTF-16 表示形式,并将它们存储在内存中,以便您可以编辑该文件。此时,您通常可以将每个字符视为一个字符;它被编码为什么字节并不重要,它被抽象掉了。一个“h”在这一点上只是一个“h”。

每个 in-memory 字符都映射到字体中的一个字形,通常是通过其 Unicode 代码点,以便能够在屏幕上为您显示它的图形表示形式。