关于 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 代码点,以便能够在屏幕上为您显示它的图形表示形式。
我知道 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 代码点,以便能够在屏幕上为您显示它的图形表示形式。