字符编码那些事-3
区位码
- 整个GB2312字符集分成94个区,每区有94个位,每个区位上只有一个字符,即每区含有94个汉字或符号,用所在的区和位来对字符进行编码(实际上就是码点值、码点编号、字符编号),因此称为区位码(或许叫“区位号”更为恰当)
- 行就是“区”、列就是“位”
国标码(交换码)
- 为了避开ASCII字符中的不可显示字符0000 0000 ~ 0001 1111(十六进制为0 ~ 1F,十进制为0 ~ 31)及空格字符0010 0000 因此,必须将“区码”和“位码”分别加上32(十六进制为20,可写作20H或0x20,后缀H或前缀0x都可表示十六进制),作为国标码
内码(机内码)
- 不过国标码还不能直接在计算机上使用,因为这样还是会和早已通用的ASCII码冲突,从而导致乱码。
- 还需要字节第一位为设为1 即 国标码+128(0x80)得到机内码
外码(输入码、输入法编码)
-
将汉字输入到计算机中的一组键盘符号
英文字母只有26个,可以把所有的字符都放到键盘上,而使用这种办法把所有的汉字都放到键盘上是不可能的。所以汉字系统需要有自己的输入码体系,使汉字与键盘能建立起对应关系。
-
目前常用的汉字外码分为以下几类
1)数字编码,比如区位码;
2)拼音编码,比如全拼、双拼、自然码等;
3)字形编码,比如五笔、表形码、郑码等。
字形码
-
字形码,又称为字型码、字模码、输出码,属于点阵代码的一种。
为了将汉字在显示器或打印机上输出,把汉字按图形符号设计成点阵图,就得到了相应的点阵代码(字形码)。
也就是用0、1表示汉字的字形,将汉字放入n行*n列的正方形(即点阵)内,该正方形共有n^2个小方格,每个小方格用一位二进制数表示,凡是笔划经过的方格其值为1,未经过的方格其值为0
疑问点:
-
区位码、国标码、内码的转换非常简单,但令人迷惑的是为什么要这么转换?
区位码---国标码 为了避免于 ASCII中的[0,32]的字符冲突 共33个字符 但是GB2312种编码是从1开始的所以 +32(0x20)即可
国标码 ---内码 为避免与 ASCII中的(33-127)字符冲突 +128(0x80)即可
-
汉字录入到显示或打印的过程
通过键盘输入汉字外码,然后输入法将汉字外码转换为当前操作系统所默认采用的字符编码方案的字符编号(即码点值),再根据字符编号通过代码页查表的方式转换为汉字内码(代码页详见前文的介绍),以实现输入汉字的目的;然后根据所选择的字体,通过汉字内码在字模库(即字库)中找出与字体相对应的字形码,从而将汉字内码转换为汉字字形码,以实现显示输出和打印输出汉字的目的
-
用现代模型解释GB系列编码
区位码相当于现代字符编码模型中编号字符集CCS的字符编号,国标码相当于字符编码方式CEF的码元序列,而机内码则相当于字符编码模式CES的字节序列
GB系列编码虽然是多字节编码,但码元却是单字节码元(码元的概念后文有详细介绍),因此不存在字节序问题,也就不存在字符编码模式CES中的大端序、小端序的概念