Character encoding 字符编码是硬件问题还是软件问题?

Character encoding 字符编码是硬件问题还是软件问题?,character-encoding,operating-system,Character Encoding,Operating System,我知道字符编码是一种用文本符号(如英文字母等)表示数据字节的方法。但我不明白的是,编码过程在计算机中的何处发生?它发生在处理器、操作系统或何处?也许我可以将你的问题改写为:字母“A”或字符“9”何时以ASCII、EBCDIC或其他格式编码 这个答案取决于it硬件 有些处理器有字符串指令。例如,某些(特别是顺序)处理器的指令可以添加字符串“123”和“456”以获得“579” 一些硬件在屏幕上显示字符串。在这种情况下,编码是依赖的 另一方面,当在软件中绘制文本(使用字体)时,编码只与软件有关 目前

我知道字符编码是一种用文本符号(如英文字母等)表示数据字节的方法。但我不明白的是,编码过程在计算机中的何处发生?它发生在处理器、操作系统或何处?

也许我可以将你的问题改写为:字母“A”或字符“9”何时以ASCII、EBCDIC或其他格式编码

这个答案取决于it硬件

有些处理器有字符串指令。例如,某些(特别是顺序)处理器的指令可以添加字符串“123”和“456”以获得“579”

一些硬件在屏幕上显示字符串。在这种情况下,编码是依赖的

另一方面,当在软件中绘制文本(使用字体)时,编码只与软件有关


目前,软件编码在很大程度上是一个软件问题。然而,有些地方字符编码对硬件很重要。

两者兼而有之。让我们看一个小例子:您可以自己编写一个非常简单的“操作系统”(最好称之为内核,尽管对于这个存根来说这还不够),它不考虑任何字符编码

void kmain(void) {
  volatile char * video = (volatile char *) 0xB8000;
  *video++ = 65; // HERE
  *video++ = 7;
}
当您编译并将其与一些代码(也不是关于编码)链接在一起并在某些x86硬件上运行时,您将在左上角看到一个“A”

这里发生的事情是,我们将值
65
写入内存位置
0xB8000
,这是VGA图形卡(启动时处于文本模式)内存映射到的位置。该硬件根据ASCII表解释该值,从而决定打印“A”的形状。它为什么这样做?嗯,它有一种索引的内部存储器,它在索引
65
处存储“A”的形状。这个形状是由硬件制造商放在那里的,可以实现为“内存中的字节”,我把它算作“软件”,也可以实现为固定的有线组件,我把它算作硬件

从更高的层次来看,屏幕上显示的字符(假设您正在运行图形环境)很可能只是图形硬件的像素字段,从软件(显示驱动程序或pango之类的字体库)中获取它们的含义

另一方面,大多数打印机区分文本和图像,因为它们了解字符编码(因此它们获得值
65
,而不是具有图形卡形状的像素字段),并且具有用于打印它们定义的字符的优化工作流程


这让我回到最初的观点:这既是硬件问题也是软件问题,因为字符编码是一种代码,一种允许不同组件(无论是硬件还是软件)相互通信的协议。

我认为编码是字符->字节,不是字节->字符。处理器不知道字符,只知道数字。编码既是最终用户的软件,也是操作系统,这就是为什么他们认为编码如此重要的原因。显示器和打印机等硬件设备将字符编码转换为字符的视觉表示。键盘将带有字符标签的按键转换为电脑接收的数字。其中一些过程可能是软件辅助的。除此之外,所有这些都在你的电脑里,例如,正如@MarkRansom所指出的,所有的数字都是数字。一个图形通常是用字体文件呈现的。字形是由组合字符组成的基本字符。字符是字符集的一个成员,映射到一个称为码点的数字。编码定义如何将数字存储为一个或多个代码单元。代码单位是编码的增量大小。如果代码单位大于一个字节,则必须知道字节顺序。示例:带波浪号“~”的拉丁文小写字母“a”是a;两者都是Unicode字符(十进制97771);UTF-16LE有两个字节码单位,以小尾数顺序排列(十六进制):61 00 03 03。@如果输出设备实际翻译为字符,我们如何仍然能够控制字体渲染?因此,真正的代码到像素映射表取决于图形硬件(VGA)。此外,字体也可以是表格的一部分