Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

计算机基础篇 | 一看就懂的字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码问题

作者头像
烟雨平生
发布于 2023-10-20 07:43:35
发布于 2023-10-20 07:43:35
6K0
举报
文章被收录于专栏:数字化之路数字化之路

概述

做通信的时候,或者使用IO流读写数据的时候脑袋总是晕晕乎乎的。 与计算机打交道久了,不可避免会看到“鬼画符”式的乱码,让人云里雾里的,特别烦人。

本文将介绍为什么会出现乱码,以及字节、字符、字符集和编码之间的关系。

为什么会出现乱码?

乱码出现的原因主要有以下几个:

  • 字符集不匹配:乱码最常见的原因是字符集不匹配。当文本使用的字符集与显示或处理该文本的程序所使用的字符集不一致时,就会出现乱码。例如,如果文本使用的是UTF-8字符集,但程序使用的是GBK字符集来解析该文本,就会导致乱码。

锟斤拷 产生的原因详见文末

  • 编码错误:在文本传输或处理过程中,如果对文本的编码方式处理不当,也会导致乱码。例如,将一个使用UTF-8编码的文本错误地以GBK编码方式进行解析,就会出现乱码。譬如鸡同鸭讲。

类似下面这种编码和解码的“字符集”不同导致的混乱:

  1. 乒乓球拍卖完了(乒乓球拍这个商品卖完了/乒乓球在拍卖会上拍卖完了)
  2. 我要煮鸡蛋(我要煮过的鸡蛋/我要把鸡蛋煮了)
  3. A国对B国的进攻早有准备(A国已经准备好进攻B国了/A国已经做好准备应对B的进攻)
  4. 他叔父原来在上海一所不错的中学里当数学教师(他叔父之前是老师,现在可能不是/原来如此,他叔父是一个老师)
  5. 咬死了猎人的狗 (猎人被咬死了/狗被咬死了)
  6. 热爱人民的总理 (一位热爱人民的总理/我们都热爱人民的总理)
  7. 今年好晦气少不得打官司猪儿大似象老鼠死干净(今年好, 晦气少, 不得打官司, 猪儿大似象, 老鼠死干净 / 今年好晦气, 少不得打官司, 猪儿大似象老鼠, 死干净。)
  8. 单号给我核查(只要单号为奇数的单子/查单子的号码)
  9. 他爬过山没有?(有没有翻过这座山/有没有攀登山的经历)
  10. 他的故事讲不完(他知道的故事多/关于他的故事讲不完)
  11. 咬死了猎人的狗(狗咬死了猎人/猎人的狗被咬死了)
  • 缺少字符映射:有些字符集可能不包含某些特殊字符或汉字,当这些字符在文本中出现时,如果没有正确的字符映射关系,就会导致乱码。
  • 文本格式错误:如果文本本身存在格式错误,例如缺少必要的编码标识或转义字符,也会导致乱码。
  • 程序处理错误:有些程序在处理文本时可能存在bug或错误,导致文本解析错误,从而产生乱码。

为了避免乱码问题,需要确保文本的字符集与程序所使用的字符集一致,并且在文本传输或处理过程中,要正确地处理编码方式。此外,还需要注意文本的格式正确性,以及程序的正确性。

为什么要编码?

字符必须编码后才能被计算机处理。 在计算机中所有的数据,在存储和运算时,都要用二进制数表示。

不知道大家有没有想过一个问题,那就是为什么要编码?我们能不能不编码? 要回答这个问题必须要回到计算机是如何表示我们人类能够理解的符号的,这些符号也就是我们人类使用的语言。 计算机只能处理二进制数据,需要将文字或符号转换为二进制形式进行处理。 由于人类的语言太多,因而表示这些语言的符号太多,无法用计算机中一个基本的存储单元—— Byte来表示,因而必须要经过拆分或一些“翻译/转换”工作,才能让计算机能理解。 目前计算机领域中广泛使用的是只有0和1的二进制语言,只能表示和存储二进制的数据,其它任何语言要能够在计算机中使用必须经过一次“翻译/转换”,把它“翻译/转换”成0和1的组合。这个“翻译/转换”的过程就是编码。编码可以实现文字或符号在计算机系统中传输和存储。

所以总的来说,编码的原因可以总结为:

  1. 计算机中存储信息的最小单元是一个字节/Byte即 8 个 bit,所以能表示的字符范围是 0~255 个
  2. 人类要表示的符号太多,无法用一个字节/Byte来完全表示
  3. 要解决这个矛盾计算机中需要一个新的数据结构 char,要实现从 char 到 Byte的相互转换则必须编码

字符是怎么编码的?

编码(Encoding):信息从一种形式或格式转换为另一种形式或格式的过程。 解码(Decoding):是编码的逆过程。就像查字典一样。

以ASCII字符集为例来聊聊字符是怎么编码的:

上图中的术语解释:

字符

字符(Character)指人类使用的文字或符号的总称,包括文字符号、图形符号、数学符号、字母、运算符号、标点符号和其他符号,以及一些功能性符号。可以由一个或多个字节表示。 一般来说我们称某个字符集里面的字符,叫xx字符,如ASCII字符集里面的ASCII字符,GB2312字符集里面的GB2312字符。

字符集

字符集(Character Set、Charset),一组字符的集合。每个字符在一个字符集中都有一个唯一的编码值(码点)。 字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。 一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。 字符集的子集也是字符集。 字符集通常用来框定一个范围。包含这些字符就已经够了,可以满足日常使用了。

常见字符集:ASCII字符集、GB2312字符集、BIG5字符集、GBK字符集、 GB18030字符集、Unicode字符集等。

码位

在字符编码术语中,又叫码点(Code Point)、编码位置,是一个字符集编码表为每一个字符分配一个唯一的数字ID。 例如,ASCII码包含128个码位,范围是016进制到7F16进制,扩展ASCII码包含256个码位,范围是016进制到FF16进制,而Unicode包含1,114,112个码位,范围是016进制到10FFFF16进制。

相同的码点在不同的字符集中映射的字符不一定是相同的。 这也是乱码的直接原因。

字符编码

字符编码(Character Encoding)规定每个“字符”分别用一个字节还是多个字节存储,用哪些字节来存储,是把字符集中的字符按一定方式转换/翻译为一个指定集合中的某一对象的规则。 外部程序通过这种编码就可以从字符集文件中调用指定的字符。我们常见的计算机字体文件就使用了字符集编码,通过输入法输入文字或者浏览网页时都会通过指定的字符集编码从字体文件中调用字符。 譬如将字符编码为由0和1两个数字所组成的位串模式、由0~9十个数字所组成的自然数序列或电脉冲等,亦即在字符集与指定集合两者之间建立一个对应关系(即映射关系)的过程。这是信息处理的一项基础技术。常见的例子包括将拉丁字母表编码成摩斯电码和ASCII码。

字符集会影响字符编码。譬如汉字有8万多个,肯定无法使用ASCII的单字节编码,因为ASCII能表达的字符太少,放不下那么多汉字。

各个国家和地区在制定编码标准的时候,“字符集”和“编码”一般都是同时制定的。

比特(bit):也可称为“位”,是计算机中最小的存储单位,是 binary digit(二进制数位)的缩写,指二进制中的一位。

字节(Octet/Byte):计算机中信息计量的一种单位,一个位就代表“0”或“1”,每8个位(bit)组成一个字节(Octet/Byte)。

GBK一个中文字符编码时会使用两个字节的形式存储 GBK规定: 汉字的第一个字节的第一位必须是 1

为什么要有字符集?

不同国家或民族的文字或符号要在计算机中存储和展示,就需要先让计算机能理解。 人类要表示的符号太多,如果要让计算机能理解所有的符号,工作量太多,且不是必要的。当初设计的时候,谁知道计算机会这么普及呢? 譬如你要看一本英文的书,要不要把日语一块学了,然后再这本英文书?这种在项目管理的角度看这种做法是“镀金”,在老板看来就叫做“脱裤子放屁”,因为只用学会英文就已经够了。

科研人员在交付系统时只需要确保计算机能理解和表达特定范围内的字符就可以了。这个范围内字符的集合就是字符集。

为什么会有这么多字符集?搞一个不就行了吗?

制定字符集是有成本的,出现这么多字符集是有历史原因的。 目前的万国码(Unicode编码标准)已经包含了世界上所有的文字、符号、数字、标点等字符。

我们从不同字符集诞生的历程来看看为什么会有这么多不同的字符集:

如果计算机一直只有美国人使用的话,没有问题。

但是后来当一些欧洲国家也开始使用计算机的时候,比如法国、德国。他们会发现,我们国家里的字符不在你这128个字符中。

于是法德两国在原有ASCII码的基础上进行了扩展。把原来的第一位0变成了1,也就是从128个字符扩展到了256个字符,即又新增了128个。 在ASCII字符集基础上包含了新增128个字符的字符集就叫做扩展ASCII字符集或ISO-8859-1字符集或Latin-1。

这个办法,解决了一些欧美国家的字符编码问题。

此时,在中国要想使用计算机,是不是也要对用到的字符进行编码。

这样看来,是不是每个国家都可以设计一套属于自己国家的编码:

随着计算机技术发展迅速,各国之间的信息交流也越来越频繁,但是不同国家、不同语言之间的文字编码标准却各不相同,这给信息交流带来了很大的困难。 为了解决这个问题,Unicode联盟成立了,开始制定Unicode编码标准,并不断完善和更新。目前,Unicode编码标准已经成为了世界上最广泛使用的文字编码标准之一,它可以支持超过13万种字符,包括世界上所有的主要文字系统。

万国码(Unicode编码标准)是一种用于表示文字的编码标准,它可以将世界上所有的文字、符号、数字、标点等字符都编码成数字,以便计算机能够识别和处理。

Unicode编码标准是一种国际标准,它由国际组织Unicode联盟制定,目的是为了解决不同国家、不同语言之间的文字编码问题。

中文编码的发展历程

ASCII

ASCII(American Standard Code for Information Interchange)美国标准信息交换码,是第一个标准字符集和编码。ASCII字符集迄今为止共收录了 128 个字符,包含了基本的拉丁字母(英文字母)、阿拉伯数字(也就是 1234567890)、标点符号(,.!等)、特殊符号(@#$%^&等)以及一些具有控制功能的字符(往往不会显示出来)。 ASCII首次发布于1963年,并于1967年成为美国国家标准,后经数次修订,1986年定型最终版本使用至今。后被ISO(International Standardization Organization)国际标准化组织定为国际标准ISO/IEC 646。ASCII码对照表是世界最通用的信息交换标准。

ASCII使用用一个字节(8 bits)进行编码,属于单字节编码。因此最多只能表示256个字符。基础的ASCII使用7bits编码,最高位位为0,或者用于奇偶校验。 ASCII编码适用于所有的拉丁字母。

ASCII既可以指ASCII字符集,也可以指ASCII编码。

后来,由于各国语言的加入,ASCII已经不能满足信息交流的需要,因此,为了能够表示其它国家的文字,各国在ASCII的基础上制定了自己的字符集,这些从ANSI标准派生的字符集被习惯的统称为ANSI字符集,它们正式的名称应该是MBCS(Multi-Byte Chactacter System,即多字节字符系统)。这些派生字符集的特点是以ASCII 127 bits为基础,兼容ASCII。

GB2312

GB2312全称《信息交换用汉字编码字符集——基本集》,是中国最早的中文字符集,属于双字节字符集 (DBCS)。也是中华人民共和国国家汉字信息交换用编码,使用2个字节表示中文字符,属于双字节编码。于1980年由国家标准总局发布。

GBK既可以指GBK字符集,也可以指GBK编码。

GB2312字符集只收录了6763个汉字,因此许多以前很少使用的生僻字没有收录,现在这些字也许变得流行了,例如:朱镕 基的“镕”字,未收入GB2312-80,现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输 入、处理都非常不方便。

Big5

Big5是用于繁体中文的字符集,属于双字节字符集 (DBCS)。采用2个字节表示中文字符,属于双字节编码。于1984年发布。

ISO8859-1

ISO8859-1 字符集,也就是 Latin-1,是西欧常用字符,包括德法两国的字母,是国际标准化组织 (ISO) 认可的 8 位字符集。于1987年发布。 ISO-8859-1 仍然是单字节编码,它总共能表示 256 个字符。向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCII一致。

ISO-8859-1字符集应用最广泛。 因为ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。这是一个很重要的特性。 换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。 ISO8859-1是 HTML 4.01 中的默认字符。

Unicode

Unicode是一种全球字符集,支持几乎所有的字符,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。于1991年发布。Unicode是由国际组织设计,是一个可以容纳全世界所有语言文字的字符集。Unicode的学名是“Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是“Unicode Character Set”的缩写。

Unicode指Unicode字符集。 Unicode的编码有多种实现方式,譬如UTF-8编码、UTF-16编码、UTF-32编码等

GBK

GBK(Chinese Internal Code Specification)是GB2312的扩展,属于双字节字符集 (DBCS)。支持更多的中文字符。于1995年发布。该编码标准兼容GB2312,即同一个字符在这些方案中总是有相同的编码,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。包括了GB2312中的全部汉字、非汉字符号、BIG5中的全部汉字、其它汉字、部首、符号,共计984个。

GBK既可以指GBK字符集,也可以指GBK编码。

GB18030

GB18030字符集是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准,即同一个字符在这些方案中总是有相同的编码,是GBK的升级版,支持更多的中文字符和国际字符。于2000年发布。采用单字节、双字节和四字节三种方式对字符编码。

GB18030既可以指GB18030字符集,也可以指GB18030编码。

最新的中文字符集是Unicode的一部分,可以使用UTF-8编码进行表示。

小结

本文以乱码为切入口,梳理了微机原理中字符的编码、字符集相关知识。 我们了解到编码是将人类文明系统中的文字或符号映射到计算机的二进制系统的过程,只有经过编码能够让计算机能够识别和处理,将人类世界的符号系统与计算机系统打通,而字符集定义了字符和编码值之间的映射关系。了解这些概念可以帮助我们更好地理解和解决乱码问题。


加油站

1、锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)

这个问题是在早期的Unicode版本中存在的,后续的Unicode版本对这个问题进行了修复。目前的Unicode版本已经没有这个问题,可以正确地表示所有字符。

之前在搜索引擎和网站上经常看到这三个有点不正经的字符。 这个乱码产生的原因是GBK字符集和Unicode字符集之间的转换出了问题。Unicode和老编码体系的转化过程中,肯定有一些字,用Unicode是没法表示的,Unicode官方用了一个占位符来表示这些文字,这就是:U+FFFD REPLACEMENT CHARACTER。那么U+FFFD的UTF-8编码出来,恰好是 '\xef\xbf\xbd'。如果这个'\xef\xbf\xbd',重复多次,例如 '\xef\xbf\xbd\xef\xbf\xbd',然后按照GBK/CP936/GB2312/GB18030的的编码规则,一个汉字2个字节,最终的结果就是:锟斤拷——锟(0xEFBF),斤(0xBDEF),拷(0xBFBD)。

后来的Unicode版本通过不断更新和扩展字符集来修复这个问题。 Unicode不断地添加新的字符,以覆盖各种语言和符号系统中的所有字符。通过这种方式,Unicode能够正确地表示所有的字符,包括之前无法表示的字符。

Unicode的修复过程主要包括以下几个方面:

  1. 添加新的字符:Unicode不断地添加新的字符,以覆盖各种语言和符号系统中的所有字符。这样,原本无法表示的字符就可以通过新添加的字符来表示了。
  2. 扩展编码空间:Unicode通过扩展编码空间来容纳更多的字符。最初的Unicode版本使用16位编码,可以表示65536个字符。后来,Unicode扩展到了21位编码,可以表示超过100万个字符。
  3. 规范化处理:Unicode还引入了规范化处理的概念,用于处理字符的等价性和兼容性。规范化处理可以将不同的字符序列转换为统一的规范形式,从而避免了字符转换过程中的乱码问题。

通过以上的修复措施,现在的Unicode版本已经能够正确地表示所有的字符,解决了之前存在的乱码问题。

2、 Octet 和 Byte

在读RFC或网络设备文档时,经常见到Octet这量词来指代8位(bit),为啥不用Byte呢?有啥区别?

Octet 总是表达8个bit (就像他名字所说的),当我们在谈论网络上的问题时,更喜欢使用这个词而不是Byte。

Byte 通常情况下也表示8个bit,但是准确的说,Byte表示的是CPU可以独立的寻址的最小内存单位(不过通过移位和逻辑运算,CPU也可以寻址到某一个单独的bit)。曾几何时,有些电脑的寻址单位不是8Bit的。而现在,大多数情况下byte可以和octet等价但是如果你想要强调准确的8bit时,你就应该使用octet而不是byte。

另外,还有一个量词 nibble用来形容一个字节的一半 (通常是4bit)不过这个词基本上没人用就是了。

#从外面打开是食物,从里面打开的是生命#

引用

https://www.cnblogs.com/softidea/p/4252698.html

中文有哪些容易让人产生歧义的词语或说法?https://www.zhihu.com/question/59099277

中文有哪些容易让人产生歧义的词语或说法?https://www.zhihu.com/question/59099277

字符编码的前世今生 https://tgideas.qq.com/webplat/info/news_version3/804/7104/7106/m5723/201307/218730.shtml

HTML ISO-8859-1 参考手册 https://www.w3school.com.cn/charsets/ref_html_8859.asp

字符编码笔记:ASCII,ANSI, GBK、ISO-8859-1, Unicode 、 UTF-8 https://blog.csdn.net/qq_30436011/article/details/128041513

字符、字符集、字符编码的基础知识科普 https://zhuanlan.zhihu.com/p/260192496

汉字字符集编码查询 https://www.qqxiuzi.cn/bianma/zifuji.php

http://www.differencebetween.com/difference-between-octet-and-vs-byte/

GBK 编码表 https://www.toolhelper.cn/Encoding/GBK

非常详细的字符编码讲解,ASCII、GB2312、GBK、Unicode、UTF-8等知识点都有 https://www.bilibili.com/video/BV1gZ4y1x7p7/

一听就懂字符集、ASCII、GBK、UTF-8、Unicode、乱码、字符编码、解码问题的讲解 https://www.bilibili.com/video/BV1xD4y1y7yc/

13-ASCII码-动画 https://www.bilibili.com/video/BV123411u7JU/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
我们在开发中是不是经常会遇到这样的问题,比如你在VS2019中创建了一个工程,里面有C语言程序和中文注释,有一天,根据工作需要,你要把其中的一部分C文件和H文件移植到Keil工程中,当你通过复制黏贴把相应文件移植到Keil工程中,并使用MDK打开时,却发现,你移植的文件C语言程序是正常显示的,但是中文却成了一堆乱码,并且一编译各种莫名其妙的报错。这其实就有可能是你的VS2019和Keil使用了不同的编码方式,因为大部分编码兼容ASCII编码,而C语言程序是英文字符,采用了ASCII编码,所以正常显示,而中文编码就不同了,比如内存中同样的0xB0A1,使用不同编码标准去对0xB0A1解码,得到的可能就是不同的汉字。
mindtechnist
2024/08/08
2.2K0
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
例如其中字母a的二进制位:1100 001 = 97,那么a在计算机中就可以用1100001来保存。
mingjie
2023/04/27
1.7K0
字符集与字符编码的区别与演进(ASCII、GBK、UNICODE)
常见字符集&乱码问题
位数:ASCII是用7位表示的,能表示128个字符;其扩展使用8位表示,表示256个字符。
全栈程序员站长
2022/09/05
7230
计算机字符编码的前世今生
有人丢给你下面这张图,如果你能清楚地说明它们之间的关系以及用途,那么你对字符编码的理解肯定过关了。
冬夜先生
2021/10/12
4440
你所不了解的字符编码
前言 在我的工作中,常常会遇到形形色色的字符编码,对于各种编码技术本人了解的也不是很多。 本篇是我了解编码系列的开篇,主要内容讲述字符编码的基本概念,然后介绍一下常见的字符编码,最后说明一下 Java
BUG弄潮儿
2021/06/25
1.1K0
你所不了解的字符编码
字符集
本文主要讲解字符集和字符编码的一些概念,通常我们所说的字符集其实指的包含了字符编码集+字符编码。但字符集有时候有时候又只是字符编码集的简称,具体语义根据上下文判断理解就行,也不是必须分的很清楚。
@阿诚
2020/09/01
1.9K0
字符集
字符编码那点事:快速理解ASCII、Unicode、GBK和UTF-8
原作者:阮一峰(ruanyifeng.com),现重新整理发布,感谢原作者的无私分享。
JackJiang
2018/08/29
2.3K0
网络编程常用的几种字符编码
如果你不知道用什么字符集,用 UTF-8,如果没有强制要求,也用 UTF-8,相信我,没错的。
HoneyMoose
2022/07/02
1K0
网络编程常用的几种字符编码
字符编码
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://polaris.blog.51cto.com/1146394/377468
拾点阳光
2018/09/28
2.3K0
架构师必须掌握的各种编码:ASCII、ISO-8859-1、GB2312...
编码在我们日常开发过程中经常有遇到,常见的编码格式有ASCII、ISO-8859-1、GB2312、GBK、GB18030、UNICODE、UTF-8、UTF-16等,其中GB2312、GBK、GB18030、UTF-8、UTF-16都可以用来表示中文,那么哪种存储中文会比较合适呢,下面会对这几种编码一一介绍便会有结论。 为什么有编码 我们知道计算机中最小的存储单位是字节(byte),一个字节所能表示的字符数又有限,1byte=8bit,一个字节最多也只能表示255个字符,而世界上的语种又多,都有各种不
Java技术栈
2018/03/30
2.3K0
MySQL字符编码指南--基础篇
要了解MySQL的字符编码,解决乱码问题,必须先了解字符编码。我们知道所谓信息,在计算机中不过是一串的位(bit:0 or 1),每8个bit组成了一个字节,而这些字节到底表示什么,取决于读到这些对象的上下文,1个字节序列,可以表示整数,字符串或者机器指令,当然也可以表示中文,日文,甚至上古文字。
DBA成江东
2023/07/15
9040
MySQL字符编码指南--基础篇
精述字符编码
带你了解ASCII,Latin1,ANSI,Unicode,UCS-2,UCS-4,UTF-8,UTF-16,UTF-32,GB2312,GB13000,GBK,GB18030,BIG5,BMP,Code Page,BOM,MBCS,Little Endian,Big Endian,内码,外码。
恋喵大鲤鱼
2018/08/03
1.6K0
精述字符编码
字符编码笔记:ASCII,Unicode和UTF-8
很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物。他们看到8个开关状态是好的,于是他们把这称为"字节"。 再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去。他们看到这样是好的,于是它们就这机器称为"计算机"。 开始计算机只在美国用。八位的字节一共可以组合出256(2的8次方)种不同的状态。 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端、打印机遇上约定好的这些字节被传过来时,就要做一些约定的动作。遇上00x10,终端就换行,遇上0x07,终端就向人们嘟嘟叫,例如遇上0x1b,打印机就打印反白的字,或者终端就用彩色显示字母。他们看到这样很好,于是就把这些0x20以下的字节状态称为"控制码"。 他们又把所有的空格、标点符号、数字、大小写字母分别用连续的字节状态表示,一直编到了第127号,这样计算机就可以用不同字节来存储英语的文字了。大家看到这样,都感觉很好,于是大家都把这个方案叫做 ANSI 的"ASCII"编码(American Standard Code for Information Interchange,美国信息互换标准代码)。当时世界上所有的计算机都用同样的ASCII方案来保存英文文字。 后来,就像建造巴比伦塔一样,世界各地的都开始使用计算机,但是很多国家用的不是英文,他们的字母里有许多是ASCII里没有的,为了可以在计算机保存他们的文字,他们决定采用127号之后的空位来表示这些新的字母、符号,还加入了很多画表格时需要用下到的横线、竖线、交叉等形状,一直把序号编到了最后一个状态255。从128到255这一页的字符集被称"扩展字符集"。从此之后,贪婪的人类再没有新的状态可以用了,美帝国主义可能没有想到还有第三世界国家的人们也希望可以用到计算机吧! 等中国人们得到计算机时,已经没有可以利用的字节状态来表示汉字,况且有6000多个常用汉字需要保存呢。但是这难不倒智慧的中国人民,我们不客气地把那些127号之后的奇异符号们直接取消掉,规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE,这样我们就可以组合出大约7000多个简体汉字了。在这些编码里,我们还把数学符号、罗马希腊的字母、日文的假名们都编进去了,连在 ASCII 里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号以下的那些就叫"半角"字符了。 中国人民看到这样很不错,于是就把这种汉字方案叫做 "GB2312"。GB2312 是对 ASCII 的中文扩展。 但是中国的汉字太多了,我们很快就就发现有许多人的人名没有办法在这里打出来,特别是某些很会麻烦别人的国家领导人。于是我们不得不继续把 GB2312 没有用到的码位找出来老实不客气地用上。 后来还是不够用,于是干脆不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容。结果扩展之后的编码方案被称为 GBK 标准,GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华民族的文化就可以在计算机时代中传承了。 中国的程序员们看到这一系列汉字编码的标准是好的,于是通称他们叫做 "DBCS"(Double Byte Charecter Set 双字节字符集)。在DBCS系列标准里,最大的特点是两字节长的汉字字符和一字节长的英文字符并存于同一套编码方案里,因此他们写的程序为了支持中文处理,必须要注意字串里的每一个字节的值,如果这个值是大于127的,那么就认为一个双字节字符集里的字符出现了。那时候凡是受过加持,会编程的计算机僧侣们都要每天念下面这个咒语数百遍: "一个汉字算两个英文字符!一个汉字算两个英文字符......" 因为当时各个国家都像中国这样搞出一套自己的编码标准,结果互相之间谁也不懂谁的编码,谁也不支持别人的编码,连大陆和台湾这样只相隔了150海里,使用着同一种语言的兄弟地区,也分别采用了不同的 DBCS 编码方案——当时的中国人想让电脑显示汉字,就必须装上一个"汉字系统",专门用来处理汉字的显示、输入的问题,但是那个台湾的愚昧封建人士写的算命程序就必须加装另一套支持 BIG5 编码的什么"倚天汉字系统"才可以用,装错了字符系统,显示就会乱了套!这怎么办?而且世界民族之林中还有那些一时用不上电脑的穷苦人民,他们的文字又怎么办? 真是计算机的巴比伦塔命
intsmaze-刘洋
2018/08/29
2.1K0
字符编码笔记:ASCII,Unicode和UTF-8
字符编码的前世今生——一文读懂字符编码
话说六年级二班有小明、小红两位同学,最近班上开了英语课,学着学着有些无聊,这时候小明想给小红传纸条,但是又担心被发现,突然小明灵机一动,在草纸上写下了一串数字12 9 11 5 21,然后就传给了小红,小红看了一眼莫名其妙,这时候小明冲着小红指了指自己英语书后面的字母表,小红看了几眼字母表,顿时明白过来,原来字母表上面有编号,小红按照编号,将这一串数字转换出来,得到的是like u,羞得小红脸色发红,这可真成了“小红”……
arcticfox
2019/06/26
2.3K0
字符编码的前世今生——一文读懂字符编码
关于字符编码的那些事
一、编码是什么 编码为了某种目的把信息从一种形式集合转换为另一种形式集合的过程,古时的鸣金收兵,从某种意义上讲也是一种编码,将帅发出了退兵的命令,为了让更多的人能够知道这个命令,传令兵把这个信息转换为了锣声,传递了出去 与编码相对的还有解码,解码是根据某种规则将信息恢复到原状的过程,士兵之前都接收过训练,在听到锣声之后,明白到锣声代表退兵,便开始执行这一命令。 旗语,电报中的莫斯电码等等,这些东西里面也包含了编码 二、关于字符集和字符编码 因为计算机中的信息都是用二进制数表示的,所以我们必须将汉字、英文按照
magicsoar
2018/02/06
1K0
关于字符编码的那些事
计算机字符编码的前世今生
有人丢给你下面这张图,如果你能清楚地说明它们之间的关系以及用途,那么你对字符编码的理解肯定过关了。
2020labs小助手
2021/08/16
4110
一文打通计算机字符编码
字符编码:字符集只是规定了有哪些字符,而最终决定采用哪些字符,每一个字符用多少字节 表示等问题,则是由编码来决定的。计算机要准确的处理各种字符集文字,需要进行字符编码, 以便计算机能 够识别和存储各种文字
一个风轻云淡
2023/09/24
2910
字符,字符集,字符编码
现在Unicode已然一统天下,我想很多年轻的程序员可能都没遇到过编码问题,更不用说了解编码的发展了。前些日子在一个老网站上偶遇乱码,虽然入行时间不短,但对其究竟也是不甚了解,好奇心驱使下落入深坑。还好经过一段时间的摸爬滚打,边学边写,总算大概理清了个脉络,记录之,分享之。
_春华秋实
2019/02/22
1.8K0
字符,字符集,字符编码
做网站,乱码?应该选用什么编码?GB2312 ? UTF-8 ?
================================================起================================================
书童小二
2018/09/03
6K0
WEB:字符集、编码、乱码 —— 看这篇就够了
ASCII(美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语,是现今最通用的单字节编码系统。
WEBJ2EE
2019/07/19
4.3K0
WEB:字符集、编码、乱码 —— 看这篇就够了
相关推荐
【字符编码那些事】ASCII、GB2312、GBK、UTF-8编码以及Unicode字符集
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档