ASCII、GBK、Unicode解析
计算机用二进制处理文字,字符编码规定了字符与二进制之间的映射关系。ASCII作为基础编码收录128个字符,各国随后发展出本地化编码,导致乱码问题。Unicode万国码整合全球字符,支持超百万字符,已成为主流发展方向,现代系统底层逐渐统一采用Unicode。
计算机处理数据的方式,说到底就是二进制——只认0和1两种状态。我们日常看到的文字,在存储之前必须先被打包成一串0和1的组合;显示的时候,再把这些二进制数据还原成对应的字符。为了让这个转换过程不出错,每个字符都得有一个独一无二的二进制编码,不能乱、不能重。这就催生了一套标准,专门规定字符和二进制代码之间的映射关系。这套标准必须被硬件厂商、软件开发者以及各类系统共同遵守,才能保证不同设备之间能正确读写和显示文本。而这种定义字符与二进制序列对应关系的规范,就是字符集,或者叫字符编码。它是计算机处理文字信息的基础,保证了数据在存储、传输和显示过程中的一致性和可靠性。
1. 严格来讲,字符集与字符编码并不是一回事。字符集给每个字符分配唯一的编号,建立起文字与二进制之间的对应关系;而字符编码则规定了这些编号在计算机里具体怎么存、怎么表示。虽然两者有本质区别,但为了便于理解,本节暂时把它们当作同一个概念来用,不做严格区分。详细的辨析会在下一节展开,到时候再深入聊聊它们的具体差异和联系。
2. 字符集给每个字符分配一个独一无二的编号,就像学生的学号一样,拿到编号就能准确地找到对应的字符。你可以把字符集想象成一张巨大的对照表,上面记录着所有字符和它们二进制编码的对应关系。计算机显示或存储文字的时候,本质上就是拿着这张表去查、去转换。随着计算机技术的发展,历史上出现过几十上百种不同的字符集,有些至今还在用,有些已经被淘汰掉了。接下来我们就来梳理一下这些字符集的发展与演变。
3. 拉丁文字母
4. 在讲计算机字符集之前,有必要先搞清楚什么是拉丁字母。很多读者可能都有这样的困惑:拉丁字母、英文字母、汉语拼音里的字母,到底有什么区别?拉丁字母又叫罗马字母,起源于古希腊字母,如今是全世界用得最广泛的文字系统。我们熟悉的A到Z这26个英文字母,就是基本拉丁字母的典型代表。它与阿拉伯字母、斯拉夫字母(西里尔字母)并称世界三大字母体系。最初,拉丁字母主要由欧洲民族使用,但随着近代欧洲的殖民扩张,这套书写系统逐渐传遍了世界各地。美洲、非洲、澳洲乃至亚洲很多地方,在语言书写上都深受其影响。中国也不例外——现在的汉语拼音方案就是用拉丁字母来拼写汉字读音的,本质上是一种外来工具。为了适应不同语言的发音特点,很多国家在26个基本字母的基础上做了扩展,最常见的方式就是加变音符号。比如拼音里的ü,就是在u上加两点;像á、à这些,是在元音字母上标声调符号来表示语音变化。总而言之,拉丁字母不仅是英语书写的基础,也通过不断演变和本地化,成了多国语言表达的重要载体。
5. 基本拉丁字母就是英语中的二十六个字母。
6. 扩展拉丁字母则是在这26个基础字母上添加变音符号、横线或斜线等衍生出来的,不同国家根据需要发展出了各自独特的形式。
7. ASCII编码方式
8. 计算机是美国人发明的,所以他们最关心的问题就是:怎么把二进制代码和英文字母(也就是拉丁字母)对应起来?早期发展阶段,各家厂商各搞各的编码规则,没有统一标准,导致不同计算机之间交换数据特别费劲。虽说编码体系不少,但比较被广泛接受的主要有两种:一个是IBM开发的EBCDIC,另一个就是本文重点介绍的ASCII。ASCII的全称是American Standard Code for Information Interchange,中文叫美国信息交换标准代码。光看名字就能明白,这套编码主要是为满足美国自己的需求设计的。它没考虑欧洲语言里用的那些扩展拉丁字符,更不用说日语、韩语这些复杂的文字体系了,至于中文那几万个汉字就更顾不上了。这倒不是说美国人故意忽略,而是技术发展初期,先解决自家问题很自然——毕竟计算机是他们造的,首先得保证英语能在数字系统里顺畅跑起来。ASCII的标准版首次发布于1967年,最后一次修订是1986年。这套编码一共收录了128个字符,包括基本的英文字母(大小写)、阿拉伯数字(0到9)、常用标点符号(逗号、句号、感叹号等)、各种特殊符号(比如@、#、$、%、^、&等),还有一些用于控制功能的不可显示字符(比如换行、回车之类)。这套编码简洁实用,成了后来很多编码标准的基础,在信息技术发展史上地位相当重要。
9. 仔细看ASCII编码表的话会发现,26个拉丁字母和阿拉伯数字在编码里都是连续排列的,这种设计给编程带来了很大的便利。比如要判断某个字符是不是大写英文字母,只要看它的ASCII码值是不是在65到90之间就行了,逻辑非常清爽。相比之下,EBCDIC编码的结构就完全不一样了,它的英文字母编码并不连续,中间断了好几个地方,导致字符处理逻辑变得很复杂,给编程带来不少麻烦。因为这种不规则性,开发者很难通过简单的数值范围来判断字符类别,代码写起来也费劲。历史上EBCDIC是IBM为自家大型机量身定做的,但随着技术发展,连IBM自己都逐渐放弃了它,全面转向更高效、更统一的ASCII标准。到今天,ASCII已经成为全球计算机系统通用的字符编码基础,几乎所有的操作系统、编程语言和通信协议都以它为核心格式。反观EBCDIC,因为结构落后、兼容性差,早就退出了主流应用。虽然在极少数老系统里可能还能找到它的影子,但总体而言,它已没什么实际价值了,逐渐被时代淘汰,最终淹没在信息技术发展的历史长河中。
10. 由于ASCII编码出现得早,已经用了十多年,大量的软件和文档都是以它为基础设计的。所以后来出现的那些字符编码方案,大多都是在ASCII的基础上做扩展,同时保持对它的兼容,这样才能保证原有的系统和文件还能正常运行。所谓兼容ASCII,就是说ASCII里已经定义好的那些字符,在新的国家或地区编码里位置保持不变——编码值完全一样,只是在原有字符集后面新增其他字符。这样就能实现平滑过渡,大家都能适配。
11. 统一码,又称万国码,是国际字符编码标准。
12. 前面提到的那些字符编码,都是各国根据自家语言和文化特点独立制定的,彼此之间不通。在一个编码环境下开发的软件或创建的文件,拿到另一个编码系统里打开,往往就识别不了,显示出一堆乱码。想正常看,还得先用专门的转码工具转换格式,用起来特别麻烦。随着全球信息交流越来越频繁,大家迫切需要一个能覆盖全世界所有文字的统一编码标准。想象一下,只要计算机支持这一种编码,就能无障碍地处理各种语言文字,既不用怕乱码,也不用费劲转码,数据交换效率一下子就提上来了。正是在这种需求的推动下,Unicode应运而生。它也叫统一码或万国码,目标就是整合全球各类字符,实现编码的统一。1994年,Unicode发布了第一个版本,到现在已经能容纳超过一百万个字符,形成了一个庞大又完整的字符集。目前主流的操作系统,像Windows、Linux、Mac OS,都已经从底层全面支持Unicode,绝大多数网页和应用程序也都在用这套标准,它的主导地位和趋势已经相当明显了。当然,为了兼容那些历史遗留的软件和文档,现在的系统里通常还保留着GB2312、GBK、Big5、Shift-JIS这些区域性编码方案,以保证多语言环境下的平稳运行。
13. 由于历史发展的原因,当前主流操作系统普遍兼容ASCII、本地化编码以及Unicode等多种字符编码方式。不过,在系统底层已经逐步转向统一采用Unicode了,有些系统甚至会在处理之前,先把其他编码自动转成Unicode格式。由此可见,Unicode已经成为字符编码发展的主流方向。开发者在设计和实现软件的时候,应该优先选用Unicode编码。这样一来,不仅有助于实现全球多语言环境的兼容,提升软件的国际化能力,还能有效减少因编码转换带来的性能损耗,提高字符处理的整体效率。
Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。
极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。
















