操作系统的字符集是个什么类型的文件?

看过了计算机系统是如何显示一个字符的? - 计算机科学 但是还是没有搞明白,字符集存在于操作系统的哪个位置?是个什么样的文件?字符集是如何来工作的,何…
关注者
125
被浏览
47,823

7 个回答

DOS 时代的话,代码页(Code Page)是显卡里的字体数据,VGA 大多数情况下是 8×16 的点阵。


后来的话就是一个编码的转换表了,把某个 charset 的编码转换到 Unicode。

你给的链接解释的挺好的啊。

你的疑问就是怎么查找字符是吧?用的是索引而并非查找。

举个例子吧,以ASCII为例,65代表大写的A,以此类推,操作系统希望找到65对应的字符,以C语言为例可以有两种最基本的写法:

char Asc2Char(int v)
{
    char c;

    if (v == 65) c = 'A';
    if (v == 66) c = 'B';
    /* ... 以此类推,有很多 if */
    if (v == 90) c = 'Z';

    return c;
}


如果字符集里有十几万个文字,就是十几万个if,这么做当然慢了。

实际情况不是这样的,实际情况是:

char map[27] = {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};

char Asc2Char(int v)
{
    return map[v - 65];
}


一句就搞定了。至于map是在内存里还是文件里无所谓。所以不存在“扫描字符集”的“扫描”动作。字符集转换是一步搞定的。

具体到代码的行为里(限Windows):

1. 程序输出的编码先转换成本地字符集(这一步可能没有,也可能是编译器链接的库里完成的)

2. 本地字符集转化成Unicode编码(这一步也可能没有,如果程序使用Unicode编码)

3. Windows使用Unicode查表,就是你说的“扫描”这一步,只不过一条转换就搞定,定位到具体的字体的文件内偏移位置(字体文件在c:\windows\fonts)

4. 解析字体文件,显示字符(由渲染代码和显卡驱动完成)。

所以没有“扫描”,只有“转换”,基本上是一步完成的。

没查Windows代码,不是特别清楚每步的具体实现,大概就是这样的。