第1章 计算机怎样处理信息:从二进制到人工智能
(建议2课时,每课时45分钟)
章首语
在聊天软件中输入一句话,大模型可以继续生成文字;把摄像头对准物体,识别程序可以给出类别;向AI编程助手说明需求,它还可以生成一个网页。这些应用的功能不同,但在计算机内部,文字、图像、声音和程序都必须先表示为数字,处理器再按照程序完成运算。
本书安排了一项贯穿14章的综合项目——班级AI应用系统。这里的“系统”不是一台专用机器,也不是一个已经建好的网站。它由一个本地网站、逐章增加的AI功能模块,以及后期可以接入的摄像头、音箱或指示灯组成。第1章只完成项目目录和第一个小工具;后续章节再加入规则问答、机器学习、语言处理、图像识别和智能体等功能。
本章开发的是一个单文件离线网页,名称为“字符编码工具”。我们将输入 A、“智”和表情符号 🙂,观察它们怎样变成字节,再由字节还原为文字。这个任务能够直接说明一个基本事实:人工智能表现出的语言、视觉和行动能力,都建立在信息表示、程序执行和硬件计算之上。
学习目标
完成本章学习后,你将能够:
- 解释二进制为什么适合数字计算机表示信息。
- 说明字符编码怎样把文字转换为字节,并区分编码与加密。
- 用输入、存储、运算、输出解释一个程序的运行过程。
- 使用AI编程助手生成离线字符编码工具,并识读关键代码。
- 建立项目目录,分类保存任务说明、程序版本和测试记录。
本章项目 建立项目目录,开发字符编码工具
本章作品是一个可以离线运行的字符编码网页。第一版按照ASCII范围处理基础英文字母、数字和常用标点。它能够正确处理 AI,但不能处理“人工智能”和表情符号。完成跨组测试后,我们将分析失败原因,再把程序升级为使用UTF-8的第二版,使它能够编码并还原多种文字。
每组设置四个角色。需求负责人确定网页必须实现的功能;开发负责人向AI编程助手提交任务说明并保存程序;测试负责人选择不同类型的文字进行未知测试;记录讲解员整理两个版本的差异,并用“输入—处理—输出”说明程序怎样工作。三人组可以合并开发和记录角色,但测试负责人不要提前公开全部测试内容。
本章还要建立项目目录 AI_Project。此后各章的任务说明、程序、测试记录和展示材料都分类保存在这个目录中。目录结构保持稳定,才能比较不同版本,也能在程序出现问题时找到修改前的文件。
准备项目目录和运行环境
1.1 建立项目目录
在计算机中建立文件夹 AI_Project,再建立 ch01_encoding 子文件夹。子文件夹内设置 spec、versions 和 evidence 三个目录。spec 保存任务说明,versions 保存每一版可运行程序,evidence 保存测试记录和截图。文件夹名称只使用英文字母、数字和下画线,可以减少不同操作系统和软件处理文件路径时产生的问题。
| 目录 | 保存内容 | 本章示例 |
|---|---|---|
spec |
目标、功能、约束和验收条件 | ch01_spec_v01.md |
versions |
不同版本的可运行程序 | index_v01.html、index_v02.html |
evidence |
测试、问题与展示证据 | challenge_record.json |
打开配套实训页 labs/ch01/index.html,完成运行环境检查。检查内容包括:浏览器能否运行本地脚本,能否下载测试记录,是否支持UTF-8编解码接口,以及页面断开网络后能否继续使用。如果学校提供AI编程助手,还要确认它能否根据文字说明生成一个完整的HTML文件。遇到检查失败时,应记录页面提示,便于判断是浏览器、文件权限还是程序本身的问题。
如果AI编程助手暂时不可用,可以直接使用配套离线网页完成两版编码实验。能够使用AI编程助手的小组,则根据任务说明生成第一版,并把配套网页作为参考版本。两种方式使用相同的测试项目、版本记录和评价标准。
1.2 把开发要求写成可以验收的任务说明
如果只对AI编程助手说“做一个把文字变成0和1的网页”,生成结果很难验收。这句话没有说明支持哪些文字、结果采用什么格式、遇到不能处理的字符时怎样提示,也没有说明网页能否联网。不同小组可能得到原理完全不同的程序,却无法判断哪一个符合学习任务。
因此,我们先把功能、限制和验收条件写清楚,开发一个故意限制字符范围的v0.1。将下面的任务说明保存为 spec/ch01_spec_v01.md,再提交给AI编程助手。
开发任务说明:字符编码工具 v0.1
目标:制作一个观察字符怎样变成二进制的离线网页。
文件:只生成一个index.html,不引用外部脚本、字体、图片或网络接口。
输入:一个文字输入框和“编码”“还原”“清空”三个按钮。
字符范围:只支持基础英文字母、数字、空格和常用英文标点。
编码:按 ASCII 字符编号处理,每个编号补成8位二进制,同时显示十进制和十六进制。
范围外字符:不得猜测或截断;用“无法编码”标出其位置。
过程:页面显示“输入—查字符表—转换进制—输出”的四步记录。
验收:A应得到十进制65和二进制01000001;AI可以编码并还原;人工智能必须出现范围提示;关闭网络后仍能运行。
这份任务说明列出了目标、输入、处理、输出、异常情况和验收条件。得到代码后,将完整文件保存为 versions/index_v01.html。双击打开,依次测试 A、AI 和 2026。三个标准测试都符合要求后,再把这一文件标记为第一版。
用未知输入测试第一版
1.3 测试字符范围和异常提示
第一版通过 AI 和 2026 后,把程序交给另一组测试。对方从测试卡中选择至少八条内容,其中既有英文,也有汉字、空格、换行和表情符号。测试过程中不修改代码,只记录输入内容、编码结果、能否还原以及页面给出的提示。
| 测试内容 | 测试目的 | v0.1应有的处理结果 |
|---|---|---|
A |
单个基础英文字符 | 得到 01000001 |
AI |
多字符顺序 | 输出两个8位编号 |
A I |
空格也是字符 | 中间多出空格的编号 |
AI后换行 |
不可见控制字符 | 字节数量增加或提示不清 |
人工智能 |
汉字 | 超出第一版字符表 |
AI助手 |
中英文混合 | 只有部分字符可编码 |
🙂 |
表情符号 | 超出第一版字符表 |
AI |
全角字母 | 看起来相似,编号却不同 |
测试结果不能只写“成功”或“失败”。输入 A 时,应记录十进制65、十六进制41和二进制 01000001;出现范围外字符时,应记录字符及其位置;测试空格、换行和全角字符时,应比较输入前后的字节变化。一次完整测试至少要保留一个正常结果、一个范围外结果和一个“外形相似但编码不同”的结果。
第一版不能处理汉字,不一定表示程序写错了。v0.1的任务说明本来就把字符范围限定在ASCII以内,它正确执行了这项限制。问题在于,这一范围无法表示世界上多种语言的文字。早期计算系统也曾针对特定语言和设备使用不同字符表。当发送方和接收方采用不同编码时,同一组字节可能显示成不同文字,也可能出现乱码。
测试结束后,先不要让AI直接改写程序。我们先解释 A 的八个二进制位怎样表示十进制65,再比较 A、“智”和 🙂 分别需要多少字节。理解字符、编号和字节之间的关系后,才能判断第二版应该采用什么编码方式。
计算机怎样表示文字
1.4 为什么数字计算机偏爱0和1
二进制是只使用0和1表示数值的一种计数方法。十进制各位的权值依次是1、10、100、1000,二进制各位的权值依次是1、2、4、8、16、32、64、128。两种计数方法都能表示数值,区别在于采用的基数不同。
八位二进制 01000001 从右向左对应1、2、4、8、16、32、64、128。只有64和1的位置为1,所以它表示十进制65。字符表再约定“编号65代表大写字母A”,屏幕上才出现 A。0和1本身不是字母,也不含有字母的形状;意义来自发送者、程序和接收者共同遵守的约定。
数字电路用两类容易区分的物理状态表示0和1,例如一定范围内的高电平和低电平。实际电信号会受到噪声影响,只要两类状态的取值范围能够清楚区分,电路就可以可靠地保存、传递和处理信息。因此,二进制适合电子计算机,并不是因为0和1本身特殊,而是因为两种状态便于用电子器件实现。
一个二进制位称为比特(bit)。八个比特通常组成一个字节(byte)。字节是计算机存储和传输数据时常用的基本单位。第一版把一个ASCII字符显示成一个8位字节,因此 AI 显示为两个字节。在UTF-8中,一个Unicode码点使用一至四个字节,不能把“一个字符”等同于“一个字节”。
1.5 字符编码给数字和文字建立对应关系
编码是按照约定,把信息转换成便于存储、传输或处理的表示形式。字符编码规定字符与数字之间的对应关系;解码则按照同一规则,把数字表示还原为字符。不同程序和设备使用同一种字符编码,才能一致地读取文字。
美国信息交换标准代码(American Standard Code for Information Interchange,ASCII)使用7位编号表示128个字符,包括英文字母、数字、标点和控制字符。在以字节为单位的系统中,它们常放在一个8位字节中,最高位为0。大写字母A的编号是65,十六进制为41,显示成8位二进制就是 01000001。
ASCII能够表示基础英文字符,却无法表示世界上众多书写系统。后来,不同地区又使用了多种字符编码。如果文件按照一种编码保存,却被程序按照另一种编码读取,原有字节没有改变,显示结果仍可能成为乱码。产生乱码的原因通常是保存和读取时使用的编码不一致。
统一码(Unicode)为不同书写系统中的字符规定统一码点。UTF-8、UTF-16和UTF-32再规定这些码点怎样转换成字节或代码单元。UTF-8(Unicode Transformation Format-8)以字节为基本单位,一个Unicode码点使用一至四个字节。ASCII范围内的字符在UTF-8中仍使用一个字节,汉字和表情符号也可以用UTF-8表示。
以UTF-8为例,大写字母A的十六进制表示仍是 41,占一个字节;汉字“智”表示为 E6 99 BA,占三个字节;表情符号 🙂 表示为 F0 9F 99 82,占四个字节。字节数不同,不能用来判断某种文字更复杂或更高级。它只反映UTF-8怎样把不同码点转换为字节序列。
| 文本 | UTF-8十六进制字节 | 字节数 |
|---|---|---|
A |
41 |
1 |
AI |
41 49 |
2 |
智 |
E6 99 BA |
3 |
🙂 |
F0 9F 99 82 |
4 |
字符编码不是加密。任何知道编码规则的人都可以把字节还原成文字;加密则需要密钥或其他安全机制,使未获授权的人难以读懂内容。把二进制写得很长,只是改变了表示形式,并没有自动保护秘密。本章接力赛使用课堂虚拟短语,不编码真实密码、身份证号或私人谈话。
【旁注】十六进制使用0—9和A—F表示数。一个十六进制数字正好对应四个二进制位,因此程序员常用两个十六进制数字简洁地记录一个字节。
算法、程序和计算机硬件
1.6 算法和程序有什么区别
编码表只规定字符与编号的对应关系,网页还需要一套处理步骤。输入文字后,程序要逐个读取字符、查找编号、转换成二进制,再按原顺序显示。如果遇到范围外字符,程序还要报告字符位置,不能把残缺结果当作完整结果。这样一组有限、明确、可以重复执行的步骤就是算法。
算法是为解决一类问题而设计的、具有明确先后关系和结束条件的步骤。菜谱和操作规程也有步骤,但计算机算法还要求每一步能够被准确执行,输入和输出范围可以说明,并且在有限步骤后停止。
下面是第一版编码算法的简化表达。它不是某种编程语言,却已经能让人检查处理顺序。
输入一段文字
依次取出每个字符
如果字符在 ASCII 范围内:
查到字符编号
把编号写成 8 位二进制
保存到输出列表
否则:
记录字符位置和“无法编码”
显示输出列表与处理记录
结束
程序是用计算机能够执行的语言表示算法和数据的指令集合。同一个算法可以用不同编程语言实现,也可以采用不同界面。算法回答“准备怎样解决问题”,程序则是能够在具体计算机上运行的实现。
AI编程助手生成 index_v01.html 时,文件中通常包含三类内容:HTML描述页面结构,CSS控制页面样式,JavaScript读取输入并执行编码算法。浏览器读取这个文件后,显示输入框和按钮,并在用户操作时运行相应程序。现阶段不要求逐行掌握全部语法,但要能指出输入、核心算法、结果输出和异常处理分别位于什么位置。
1.7 一次程序运行需要哪些硬件功能
按下“编码”按钮时,一次计算开始了。键盘和输入框把文字送入系统;内存暂时保存文字、字节和中间结果;处理器执行程序中的判断和转换;屏幕显示最终结果。如果保存文件,存储设备还会在断电后长期保留程序和记录。
| 功能 | 在字符编码工具中的表现 | 常见硬件或部件 |
|---|---|---|
| 输入 | 键盘输入文字、鼠标点击按钮 | 键盘、鼠标、触摸屏 |
| 存储 | 保存程序、规则和实验记录 | 内存、固态硬盘 |
| 运算与控制 | 执行查表、判断、进制转换 | 中央处理器等计算部件 |
| 输出 | 显示文字、字节、错误和日志 | 显示器、音箱、打印机 |
这里的“存储”包含不同时间尺度。内存适合程序运行时快速读写,断电后通常不保留当前内容;固态硬盘等存储设备用于长期保存文件。处理器也不是独自完成全部工作,它不断从内存取得指令和数据,把结果写回,再通过输入输出设备与人和环境连接。
通用计算机可以完成文字处理、图像编辑、音乐播放和人工智能推理等不同任务,原因在于多种信息都能表示为数字,不同程序再按照各自的算法处理这些数字。同一台计算机运行不同程序,就可以完成不同任务。
这不表示计算机可以无条件解决任何问题。一个任务首先要有可以取得的输入和能够执行的步骤,还会受到运行时间、存储容量、数据质量和算法能力的限制。有些问题缺少必要信息,有些计算需要过长时间,有些现实决定也必须由人承担责任。学习人工智能,既要了解计算机能够完成什么,也要了解它受到哪些条件限制。
1.8 人工智能系统也要完成信息表示和计算
人工智能系统处理的对象比本章的字符更加丰富,但基本过程相同。文字可以编码为数字序列,图像可以表示为像素数值,声音可以经过采样变成数字序列,训练后的模型也保存为大量数值。模型运行时,处理器按照程序对这些数据进行运算,再把结果转换为人能看到或听到的文字、图像和声音,或者转换为设备动作。
因此,大模型生成文字、图像识别程序判断物体,以及智能体调用工具,都可以从“输入—表示—计算—输出”四个环节进行分析。它们采用的算法远比字符编码复杂,处理的数据规模也大得多,但都离不开数字表示、程序和计算机硬件。后续章节将继续学习数据、模型、训练、自然语言处理、计算机视觉和内容生成的基本原理。
用UTF-8完成第二版
第一版的测试记录已经说明ASCII范围不能表示汉字和表情符号。第二版不再逐个添加字符规则,而是使用浏览器提供的UTF-8编解码接口。修改前先复制 index_v01.html,将新文件命名为 index_v02.html,不得覆盖第一版。保留两个版本,才能比较修改前后的字符范围、字节数量和异常处理。
把下面的版本升级说明提交给AI编程助手,或者在配套网页中切换到v0.2。
版本升级说明:字符编码工具 v0.2
- 使用浏览器内置的
TextEncoder按 UTF-8 把文字转换为字节。- 每个字节同时显示十六进制和8位二进制。
- 显示用户看到的字符数量和实际 UTF-8 字节数量,不把二者混为一谈。
- 使用
TextDecoder完成还原;字节格式错误时必须提示,不得输出似是而非的文字。- 增加“复制字节”“交换后还原”和“导出测试记录”。
- 保持单文件、中文界面和离线运行,不增加网络请求。
第二版的核心代码可能接近下面两行。第一行把文字交给 UTF-8 编码器,得到字节序列;第二行把每个字节补足为8位二进制,再用空格连接。变量名和页面结构可能不同,但处理方向应当一致。
const bytes = new TextEncoder().encode(text);
const binary = [...bytes].map(byte => byte.toString(2).padStart(8, "0")).join(" ");
完成代码后,重新运行第一版的全部挑战,特别检查 A、AI、人工智能、AI助手、🙂、空格、换行和全角字母。第二版应能完整编码并还原,但输出字节数会不同。测试记录必须显示至少两项版本差异:支持范围扩大;字符数量与字节数量不再总是相等。
如果页面能编码却不能还原,先检查输入字节是否按空格分开、十六进制是否含非法字符、解码器是否明确使用 UTF-8。让 AI 修复时应提交实际输入、实际输出、预期输出和错误提示,而不是只说“不能用”。这种依据运行证据提出修改的方式,将贯穿后续所有作品。
完成跨组编码测试和项目记录
每组选择一条4—10个字符的课堂短语,至少包含英文、汉字或表情符号中的两类。使用 v0.2 生成十六进制字节,把字节交给另一组,但不交原文。接收组将字节粘贴到还原区,记录能否恢复原文。如果失败,两组先核对是否使用同一种编码,再检查复制时是否丢失或增加字节。
展示控制在六十秒。前十五秒说明 v0.1 能处理什么;接着用一个汉字或表情符号展示它的边界;随后展示 v0.2 的 UTF-8 字节和成功还原;最后指向计算机的输入、存储、运算和输出四个环节。展示重点不是谁的二进制串更长,而是谁能准确说明每一层表示和程序步骤。
完成接力后,在 AI_Project 根目录建立 PROJECT_RECORD.md,记录小组名称、使用设备和浏览器、本章采用的开发方式、离线备用方式,以及两个程序版本的保存位置。至此,班级AI应用系统完成第一个功能模块。下一章将开发规则问答机器人,用一个可运行程序观察早期人工智能的规则方法。
安全与责任
本章只使用虚构短语和公开文字,不输入真实账号、密码、身份证号、住址和私人聊天内容。AI编程助手生成的网页应保持离线,不上传用户输入。打开其他小组的文件前,先确认来源和文件类型;本章只运行经过教师或配套资源确认的HTML文件,不运行来源不明的可执行程序。保存新版本时,应保留旧版和测试记录,不能通过覆盖文件隐藏失败结果。
本章小结
数字计算机用容易区分的两类物理状态表示二进制位,八个比特通常组成一个字节。数字本身没有固定的文字含义,字符编码通过共同约定建立字符与数字表示的对应关系。ASCII覆盖基础英文字符,Unicode为不同书写系统中的字符规定统一码点,UTF-8再把码点编码为一至四个字节。编码用于一致地表示和交换信息,不等同于加密。
算法说明解决问题的明确步骤,程序把算法和数据写成计算机可以执行的形式。一次程序运行可以从输入、存储、运算和输出四个方面观察。文字、图像、声音和模型都能表示为数字,人工智能系统也必须由程序在硬件上完成计算。它的能力十分丰富,但仍受到输入、算法、数据、硬件和责任边界约束。
本章建立了 AI_Project 项目目录,并保留字符编码工具的两个版本。v0.1按照ASCII范围处理字符,v0.2使用UTF-8扩大了可处理的文字范围。我们先用未知输入确认第一版的适用范围,再根据字符编码原理完成升级。这种“保存版本—运行测试—分析证据—修改程序”的方法,将继续用于班级AI应用系统的后续开发。
习题
基础题
- 十进制65为什么可以写成二进制
01000001?请指出其中哪些位的权值相加得到65。 - 编码器收到
01000001后,为什么还需要知道编码约定,才能把它显示成A? - 分别用一句话说明算法和程序,并举出二者在本章作品中的对应内容。
- “把真实密码变成二进制就安全了”是否正确?请说明理由。
应用题
- 某小组发现字符串
AI占2个 UTF-8 字节,而智占3个字节。能否据此判断一个汉字等于三个英文字符?为什么? - 一个离线编码页面点击按钮后没有输出。请按照输入、存储、运算、输出四个环节,分别提出一项检查内容。
探究题
- 【选做】分别测试半角字母
A、全角字母A、数字1和汉字一,记录它们的 UTF-8 字节。说明“看起来相似”为什么不能代替编码检查。 - 【选做】选择电商商品编号、数媒文件名或汽车零件记录中的一种文本,设计三条命名规则,使它在不同电脑之间交换时更不容易产生编码和路径问题。
本章交付物
1. 主作品与过程证据
提交 AI_Project/ch01_encoding 文件夹,包含任务说明、index_v01.html、index_v02.html、至少八条测试内容的记录和 PROJECT_RECORD.md。两个版本都应能够离线打开,测试记录应清楚显示第一版的字符范围以及第二版采用UTF-8后的变化。
| 评价维度 | 达成标志 |
|---|---|
| 项目目录 | 任务说明、程序版本和测试证据分别保存,文件命名清楚 |
| 作品运行 | 两版均可离线打开,编码与还原行为符合任务说明 |
| 测试证据 | 包含英文、汉字、混合文字、空白或表情符号 |
| 原理解释 | 能说明二进制、编码、算法、程序和四类硬件功能 |
| 责任边界 | 明确编码不是加密,不处理真实敏感信息 |
2. 自评单
- [ ] 我能用64加1解释
01000001为什么表示65。 - [ ] 我能说明字符、字节和屏幕文字不是同一层概念。
- [ ] 我保留了 v0.1,没有用最终文件覆盖第一版证据。
- [ ] 我能指出程序中的输入、算法、输出和异常处理位置。
- [ ] 我们用另一组提供的未知输入完成了测试。
- [ ] 我知道编码不能代替加密,也没有输入真实密码。