Turbo C 是一个西文编辑平台,不能直接显示汉字,除非先安装中文操作系统(如 UCDOS)。
但是安装中文操作系统会占用大量内存,有可能使 TC 无法加载或引起功 能冲突。
在西文状态下显示和放大汉字的方法
采用这种方法, 不需要安装中文系统,所需要的仅是一个或几个字库文件。
汉字编码
1.区位码
汉字有数万个(康熙字典收录 47000 多个),但绝大多数都不常用。
最常用的高 频字仅约 100 个,常用字约 3000 个,次常用字约 4000 个,罕见字约 8000 个,其余 都是死字。
1981 年,我国公布了《通讯用汉字字符集(基本集)及其交换码标准》 GB2312-80 方案,把高频字、常用字、次常用字汇集起来组成了汉字基本字符集(共 6763 个汉字)。
在该字符集中又根据使用频度把汉字分为一级汉字(3755 个,按拼 音排序)和二级汉字(3008 个,按部首排序)。除了这两级汉字,字符集还包括西 文字符、数字、图形符号共 700 多个非汉字字符。
汉字字符集(GB2312-80)将两级汉字和 700 多个非汉字字符都汇集在一张表 格中,该表格共有 94 行 94 列,每行称作一个“区”,每列称作一个“位”。(从1区,1位开始。)前 15 区 为非汉字字符,从 16 区开始才是汉字。
一个汉字(或符号)在表格中所处的行与列(即区和位)构成了一个汉字(或 符号)的区位码。例如:汉字“啊”位于第 16 行第 1 列,故“啊”的区位码是 1601。
2.国标码
计算机要处理汉字,必须给每个汉字一个唯一的编码,这些编码称作国标码。
英文字符是用一个字节进行编码的,即 ASCII 码,而汉字数量众多,需要用两 个字节才足以完成编码,所以汉字的国标码是两个字节。
国标码的两个字节是这样来的:将汉字(包括前 15 区的符号)的区号和位号分别加上 32 并各用一个字节表示出来。
汉字的区号、位号最大是 94,94 + 32 = 126,不超过 127,因此国标码的两个字节最 高位都是 0。
3.机内码
每个汉字都有唯一的国标码,按说可以用计算机处理汉字了,但不幸的是,计 算机不仅要处理汉字,还要处理英文字符,而汉字国标码和英文编码是存在冲突的。
汉字的国标码有两个字节,例如:“大”的国标码是:00110100 01110011,如 果把国标码的这两个字节直接存储到计算机中,则系统很可能把它们当做两个英文 字符(字符‘4’和字符‘i’), 因此计算机内部不能存储国标码。
为此,计算机内部存储汉字编码时,通常都是把国标码两个字节的最高位都改 为 1,这样就由国标码变成了机内码(计算机内部实际存储的汉字编码)。如:“大” 的国标码是 00110100 01110011(0x3473),机内码是:10110100 11110011(0xb4f3)。
在内存中存储机内码时,总是把与区号相关的字节存储在低字节,而把 与位号相关的字节存储在高字节。
机内码是在国标码的基础上将两字节最高位都变为 1 而得来,相当于两个字节 各加了 128。
有了区位码和国标码的32,国标码和机内码的128,这些量就可以相互转换。
e.g.1:计算“大”的区号和位号
char c[3] = ”大”;
int qh, wh;
qh = c[0] - 160;
wh = c[1] - 160;
e.g.2:存储汉字到数组中
1.char c[5] = ”大小”;
2.strcpy(c,”大小”);
4.字形码
不同的汉字,其形状是不同的。
为在计算机中显示汉字,通常都是先把每个汉 字的形状记录下来形成字形码。
16 点阵宋体字库中“大”字的字形码是这样来的:
16*16 的正方形表格中,从左上角的小方格开始记录,若小方格被“大”字覆盖, 则记为 1,否则记为 0。
![088285dd501e52a8c87a489ec4b68409.png](https://i-blog.csdnimg.cn/blog_migrate/72471a1acd331c5284b18fa1cde7cc5c.jpeg)
![5dba01a19b161ec2ff9759e8fecec45f.png](https://i-blog.csdnimg.cn/blog_migrate/bd036a1d9930cb8df925331051fb3e2b.jpeg)
图 中共 16*16 = 256 小格,每 8 小格记成 1 个字节,所以 16 点阵字库中每个 汉字的字形码都是 32 字节。
按照汉字(符号)在区位表中的排列顺序把每个汉字(符号)的字形码汇集起 来存储到一个文件中,该文件便是字库文件(简称字库)。
字库中存有区位表中所有汉字(符号)的字形码。当需要显示某汉字时,必须 先从字库中调出该汉字的字形码,而后才能在屏幕上把它显示出来。
根据点阵数目的不同和汉字字体的不同,字库又分为:16 点阵宋体字库、16 点 阵楷体字库……,24 点阵宋体字库、24 点阵楷体字库……,48 点阵宋体字库…… 等,点阵数越大,字体笔画越平滑,点阵越小,笔画锯齿越严重。
5.地址码
一个汉字的字形码在字库中的起始地址称为该汉字的地址码。
“大”字的字形码存储在字库的位置:
“大”字在区位表中处于 20 区 83 位,在它前面共有(20 - 1)* 94 + (83 - 1)个汉 字(或符号)。
由于 16 点阵字库中每个汉字(符号)的字形码都是 32 字节,所以“大” 字的字形码在字库中的起始地址是:( (20 - 1) * 94 + (83 - 1) ) * 32 +1(下一个)-1(文件字节数从0开始)。
以上所有陈述原文均来自王金鹏, 肖进杰 编著的 《C 程序设计案例与提高教程 》