信息编码的秘密:从ASCII到汉字


以前说,我们处于信息时代。
现在说,我们处于信息爆炸时代。
未来可能说,我们处于信息毁灭时代。
信息为啥这么牛叉呢?这玩艺到底是个啥?本文介绍了信息、信息编码的概念、英文编码和汉字编码系统,并附有信息学奥赛CSP-J第一轮习题。

一、什么是信息编码

信息就是音信消息,音就是声音,信就是书信。也就是说,信息是能用声音、文字、符号或图传播出去的玩艺。
它就像病毒一样,能复制、能传播,而且要依附于宿主(信息载体)。
牛津词典对信息的解释:

~ (on/about sb/sth)facts or details about sb/sth信息;消息;情报;资料;资讯

编码就是代替信息的文字和符号。无论你是光,你是电,你是什么样的神话,统统变成文字和符号。
牛津词典对code的解释:

a system of words, letters, numbers or symbols that represent a message or record information secretly or in a shorter form密码;暗码;电码;代码

信息编码(Information Coding)是指将信息从一种形式转换为另一种形式的过程,以便于存储、传输或处理。
对于计算机而言,就是指按照预先规定的方法将文字、数字或其他信息转换成一堆0和1。本质上,它其实就是一个翻译过程,把人类语言翻译成计算机语言。

二、ASCII码

ASCII码全称为美国信息交换标准代码(American Standard Code for Information Interchange,ASCII),是由美国国家标准委员会制定的一种包括数字、字母、通用符号和控制符号在内的字符编码集。ASCII码是一种7位二进制编码,能表示 2 7 = 128 2^7=128 27128种国际上最通用的西文字符,是目前计算机使用最普遍的字符编码集。
在这里插入图片描述
看看表上这些字符的模样就会明白一句至理名言:各人自扫门前雪,休管他人瓦上霜。
电脑是人美国人发明的,人家自然只管自己家用的文字符号,只需要128个就够了。
对于上表,咱们并不需要记忆,只要需知道两点:

  • ASCII码值的大小:字符<大写字母<小写字母;
  • *编号连续性:字符、大写字母、小写字母之间隔着一些其他字符,但它们内部的编号是连续的。

不管什么时候,如果忘了某字符的ASCII码,都可以简单的编个程序打印出来。如下面的程序打印了所有大写字符的ASCII码值。

#include <stdio.h>

int main() {

    // 循环打印从'A'到'Z'的所有大写字母
    for (char i = 'A'; i <= 'Z'; ++i) {
        printf("%c %d\n", i, i);
    }
    return 0;
}

三、内码和外码

在聊新的编码方式之前,咱们得先搞清楚两个概念:内码和外码。

  • 内码:也叫机内码,是计算机内部用来存储和处理字符的二进制代码。它决定了字符在计算机内部的表示方式。
  • 外码:也叫输入码,是我们输入字符时所使用的编码方式。它决定了我们如何向计算机输入字符。

比如前面说的ASCII码就是内码,而输入的字符“A”就是外码,计算机将外码转换成内码65后存储在内存中,当然实际存储的是65的二进制数01000001。

四、汉字信息编码

对于汉字来说,只能表示128个字符的ASCII码就太不够看了,给汉字提鞋都不配。人家美国人不管,咱们只好自己想辙。

4.1 区位码

区位码就是GB2312编码方案,它把常用的汉字、数字和符号分类编在了一个方阵里,方阵的每一行称为“区”,每一列称为“位”,区码和位码均采用从01到94的十进制表示。方阵里的每个字符用4位十进制数表示,前两位是它的区码,后两位是它的位码。
区码表示汉字的类别(比如常用汉字、次常用汉字等),位码表示在该类别中的顺序。比如,“中”字的区位码是5448,其中54是区码,48是位码。
下面,咱们用C语言来实现一个简单的程序,把输入的汉字转换成对应的区位码和国际码。

4.2 国际码

国标码全称是《信息交换用汉字编码字符集·基本集》,采用十六进制的21H到73H表示。
国际码是在区位码的基础上,通过一定的转换规则得到的。
转换规则是这样的:区码和位码分别加上十进制数32(十六进制为20H),就是对应的国标码。例如,“大”字的区位码为2083,对应的国标码就是3473H。
但是,国际码还不是计算机内部最终存储的编码方式。因为国际码是基于GB2312字符集的,而GB2312字符集只包含了6763个常用汉字和682个非汉字字符,对于更多的汉字和字符,GB2312就无能为力了。于是,后来又出现了GBK、GB18030等扩展字符集,最后人美国人把全世界的文字符号一勺烩了,整出个Unicode码。

#include <stdio.h>
#include <stdlib.h>

//定义含有汉字及对应区位码的结构体
typedef struct {
    char hanzi[2]; // 汉字(两个字节)
    short quwei;   // 区位码(两个字节合并成一个短整型)
} HanziQuwei;

// 结构体赋值:汉字到区位码的转换表(只列出了部分汉字作为示例)
// 实际应用中,这个表应该包含所有GB2312字符集中的汉字
HanziQuwei hanziTable[] = {
    {"中", 0x3630}, // “中”字的区位码是5448(十六进制3630)
    {"国", 0x564e}, // “国”字的区位码是5886(十六进制564e)
    {"\0", 0}       // 标记表尾
};

// 查找汉字对应的区位码
short findQuwei(char *hanzi) {
    for (int i = 0; hanziTable[i].hanzi[0] != '\0'; i++) {
        if (hanziTable[i].hanzi[0] == hanzi[0] && hanziTable[i].hanzi[1] == hanzi[1]) {
            return hanziTable[i].quwei;
        }
    }
    return -1; // 未找到
}

// 区位码转国际码
short quweiToGuoji(short quwei) {
    short guoji = ((quwei >> 8) & 0xff) + 0x20 + ((quwei & 0xff) + 0x20) * 256;
    return guoji;
}

int main() {
    char hanzi[3]; // 汉字(两个字节)加上一个结束符
    printf("请输入一个汉字:");
    scanf("%2s", hanzi); // 读取两个字节的输入(即一个汉字)

    short quwei = findQuwei(hanzi);
    if (quwei == -1) {
        printf("未找到该汉字的区位码。\n");
        return 1;
    }

    printf("该汉字的区位码是:%04X\n", quwei);

    short guoji = quweiToGuoji(quwei);
    printf("该汉字的国际码是:%04X\n", guoji);

    return 0;
}

4.3 字形存储码

字形存储码是指供计算机输出(显示或打印)汉字时用的二进制码,也称字模,常见的是数字化点阵字模。
一般的点阵规模大小有16×16、24×24等,每一个点在存储器中用一个二进制位(bit)存储。比如,在16×16的点阵中,需16×16 bit的存储空间,也就是16×16÷8=32字节的存储空间。在相同点阵中,不管其笔画繁简,每个汉字所占的字节数相等。为了节省存储空间,普遍采用字形数据压缩技术,例如矢量汉字就是用矢量方法将汉字点阵字模进行压缩后得到的汉字字形的数字化信息。
在这里插入图片描述

五、扩展字符集

前面说了GB2312字符集不够用,就需要扩展,GBK、GB18030等扩展字符集应运而生。

  • GBK:全称是《汉字内码扩展规范》,它扩展了GB2312字符集,包含了21003个汉字和883个符号。GBK不仅兼容GB2312字符集,还增加了许多新的汉字和符号。
  • GB18030:全称是《信息技术 中文编码字符集》,它是GBK的超集,包含了更多的汉字和符号。GB18030不仅兼容GBK和GB2312字符集,还支持Unicode标准,能够表示世界上几乎所有的字符。

最后,再说Unicode这个“编码界的联合国”。Unicode标准是为了解决不同国家和地区之间字符编码不兼容的问题而诞生的。它给每个字符分配了一个唯一的数字代码(称为码点),这个码点在全球范围内都是唯一的。这样,无论在哪个国家、哪个地区,只要使用Unicode编码,就能正确地显示和处理字符。
Unicode包含了世界上几乎所有的字符,而且还在不断更新和扩展,以适应新的字符需求。

六、CSP-J习题

6.1 真题解析

1.【2019年第3题】一个32位整型变量占用( )字节。
A.32
B.128
C.4
D.8
【解析】1字节= 8位,因此32位整型变量占用4字节。
【答案】C
2.【2020年第4题】现有一张分辨率为2048像素× 1024像素的32位真彩色图像。请问要存储这张图像,需要多大的存储空间?( )。
A.16MB
B.4MB
C.8MB
D.2MB
【解析】该图片一共需要2048×1024×32位二进制,因为1字节(byte)等于8位(bit)二进制,1MB=1024KB=1024×1024B,所以需要2048×1024×32/(8×1024×1024) MB,即8MB。
【答案】C

6.2 相关习题

1.ASCII码的含义是( )。
A.一个简单的中文信息编码
B.通用字符编码
C.计算机信息交换标准代码二代
D.美国信息交换标准代码
【解析】ASCII码的全称是“美国信息交换标准代码”。
【答案】D
2.已知大写字母A的十进制ASCII码为65,则大写字母K的十进制ASCII码为( )。
A.72
B.73
C.75
D.76
【解析】在ASCII码表中,字母字符的ASCII码是连续的,所以大写字母K的ASCII码为65+10=75。
【答案】C
3.字符0的ASCII码为48,则字符8的ASCII码为( )。
A.8
B.56
C.128
D.视具体的计算机而定
【解析】在ASCII码表中,因为数字字符的ASCII码是连续的,所以8的ASCII码为48+(8−0)=56。
【答案】B
4.关于ASCII码,下面哪个说法是正确的?( )
A.ASCII码表一共包含了256个不同的字符
B.ASCII码方案最初由英国人图灵提出
C.最新扩展的ASCII码方案包含了汉字、阿拉伯语的字符编码
D.一个ASCII码使用一字节的内存空间就能够存放
【解析】ASCII码表中共有128个不同的编码,最初由美国电气和电子工程师协会制定,不能表示中文。
【答案】D
5.已知大写英文字母A的ASCII码比小写英文字母a的ASCII码小32,则大写英文字符Q的ASCII码比小写英文字母n的ASCII码( )。
A.大3
B.小3
C.小29
D.小35
【解析】26个大写英文字母的ASCII码是连续的,26个小写英文字母的ASCII码也是连续的,所以可以根据A的ASCII码得到Q的ASCII码为81,根据a的ASCII码得到n的ASCII码为110,所以Q的ASCII码比n的ASCII码小29。
【答案】C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值