我知道字符编码是用英文字母等文本符号表示数据字节的方法。但我不明白的是计算机在编码过程中的位置是什么?它是在处理器,操作系统中还是在哪里发生的?
答案 0 :(得分:1)
也许我可以将你的问题改写为:什么时候字母“A”或字符“9”是用ASCII,EBCDIC等编码的。
答案是硬件依赖。
某些处理器有字符串指令。例如,某些(特别是订单)处理器的指令可以添加字符串“123”和“456”以获得“579”
某些硬件在屏幕上显示字符串。在这种情况下,编码是依赖的。
另一方面,当用软件(带字体)绘制文本时,编码只对软件有用。
目前大多数情况下,软件编码是一个软件问题。但是,有些地方字符编码对硬件很重要。
答案 1 :(得分:1)
两者兼而有之。让我们看一个小例子:你可以自己编写一个非常简单的“操作系统”(更好地称之为内核,尽管这对于这个存根来说还不够),它不考虑任何字符编码所以:
void kmain(void) {
volatile char * video = (volatile char *) 0xB8000;
*video++ = 65; // HERE
*video++ = 7;
}
当您编译并链接一些small startup assembler代码(也不是编码)并在某些x86硬件上运行时,您会在左上角看到“A”。
这里发生的是我们将值65
写入内存位置0xB8000
,这是VGA图形卡的内存(启动时处于文本模式)的位置至。该硬件根据ASCII表解释该值,因此决定打印“A”的形状。它为什么这样做?嗯,它有一些索引内部存储,它在索引65
存储“A”的形状。这种形状由硬件制造商提供,可能被实现为“某些存储器中的字节”,我将其视为“软件”或固定的有线组件,我将其视为硬件。
更高层次,屏幕上显示的字符(假设您正在运行图形环境)很可能只是图形硬件的像素字段,从软件中获取其含义(显示驱动程序,或像pango这样的字体库。
另一方面,大多数打印机区分文本和图像,因为它们理解字符编码(因此它们得到值65
,而不是具有类似形状的像素字段图形卡)并具有优化的工作流程,用于打印他们定义的字符。
这让我回到最初的主张:这既是硬件问题,也是软件问题,因为字符编码是代码,这是一种协议,定义为允许不同的组件(无论是硬件还是软件)进行通信彼此。