问题描述
我了解ASCII是一种字符编码方案,其中为Byte分配了某个十进制数字,十六进制代码或我们的字母。
我不了解,也无法通过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编码的字符)或其他可能需要的符号。但是“无符号数”的解释是最直接的解释之一。
,例如,当我编写一个文本为“ hello world”的文本文件时,计算机在做什么?
当您敲击键盘上的那些键时,键盘与计算机之间的某种协议可使计算机知道按下了哪些键。计算机根据当前选择的键盘布局将其转换为字符,例如“ h”。这也可能会导致您的视频游戏角色向侧面移动或其他任何原因,按键与其导致的结果之间没有直接联系。但是,假设您在文本编辑器中,并且计算机将您敲击“ h”键解释为“输入字母 h ”。现在将其转换为某种内部的内存中字符表示形式。内存中的表示形式通常是UTF-16编码的字节,因此计算机可以表示任何和所有可能的Unicode字符。
当单击文件→另存为...时,您选择以ASCII编码存储文件。现在,文本编辑器会根据UTF-16 / Unicode→ASCII编码表,遍历存储在内存中的UTF-16字节,并将它们全部转换为等效的ASCII字节。这些字节存储在磁盘上。
再次打开该文件时,文本编辑器从磁盘读取这些字节,可能将它们转换为内部UTF-16表示形式,并将其存储在内存中,以便您可以编辑文件。此时,您通常可以将每个字符视为一个 character ;它被编码成什么字节,被抽象掉都没有关系。此时,“ h”只是一个“ h”。
每个内存中字符通常通过其Unicode代码点映射到字体中的字形,以便能够在屏幕上为您显示图形化表示。