首发于 字符编码:计算机的巴别塔

巴别塔:《圣经·旧约·创世记》第11章宣称,当时人类联合起来兴建希望能通往天堂的高塔;为了阻止人类的计划,上帝让人类说不同的语言,使人类相互之间不能沟通,计划因此失败,人类自此各散东西。此故事试图为世上出现不同语言和种族提供解释。

我们曾经在HTTP的响应头中见到过Content-Type:text/html; charset=utf-8,也曾在HTML文件中见到过<meta charset="utf-8">。它们都是用于声明字符编码为utf-8。那么utf-8到底是什么?这要从计算机的起源说起。

最早的计算机是机械式继电器计算机,通过继电器的开关状态来表示0和1。后来的电子管计算机、晶体管计算机、集成电路计算机都继承了这一设定,这也是为什么计算机以二进制来存储数据。

人类发明计算机的目的是处理数据,而绝大多数数据都是文本形式的,所以要把这些文本转换为计算机可识别的二进制数据,再把计算机处理过的二进制数据转换为人类可识别的文本。这个二进制和文本的对照表就是字符集。

ASCII

美国人发明了最早的现代计算机。所以美国人最初制定了ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)来保存控制码、空格、标点符号、数字、大小写字母。计算机的一个字节可以组合出2^8种不同的状态。 ASCII使用了128个状态。

编号从0开始的32种状态分别规定了特殊的用途,这些0×20以下的字节状态称为”控制码”。

随着世界各地的不同国家开始使用计算机,为了可以在计算机中使用ASCII中没有制定的文字,在128至255号之后的状态来表示这些新的字母、符号。这些字符集被称“扩展字符集”。

GB2312、GBK和BIG5

ASCII中是没有汉字的,而常用简体汉字就有几千个。所以中国制定了GB2312(GB是国标的拼音缩写)。GB2312规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字。GB2312收录了6763个常用汉字。这也是为什么在以前一个汉字算两个英文字符的原因。

但是汉字有那么多,GB2312中并不包含生僻字,所以还是需要扩展。扩展之后的编码方案被称为GBK标准,GBK包括了GB2312的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。

当时同文同种的港台同胞们也制定一套编码标准BIG5,这套标准和GB2312/GBK并不兼容。而世界各地其他国家也制定了自己的标准。虽然本地使用没有问题,然而在网络中由于字符集不兼容,大家谁也看不懂别人的编码,互相访问就会出现乱码。我们仿佛进入了巴别塔被摧毁后的世界。

unicode

为解决这个问题,ISO(国际标谁化组织)制定了通用字符集:“Universal Multiple-Octet Coded Character Set”,简称UCS,又称unicode

ISO规定必须用4个字节来统一表示所有的字符,对于ASCII里的那些“半角”字符,unicode包持其原编码不变,只是将其长度由原来的8位扩展为32位,高位全部置为0,而其他语言的字符则全部重新统一编码。这个字符集的编码方式称为UTF-32(32-bit UCS Transfer Format)。

有2^32个状态的unicode以后会不会也不够用?以前我们还觉得IPv4的地址用不完呢。但人类之所以伟大,原因之一就在于我们能够通过无穷的创造力解决各种问题。

如果按照unicode规定,每个符号用4个字节表示,那么文本文件的大小会因此大出二三倍,在存储和传输上就会很浪费。这也是unicode在很长一段时间内无法推广的原因。

UTF-8

直到UTF-8的出现。UTF-8(8-bit Unicode Transformation Format)是一种针对unicode的可变长度字符编码。它可以用来表示unicode标准中的任何字符,且其编码中的第一个字节仍与ASCII兼容,这使得原来处理ASCII字符的软件无须或只须做少部份修改,即可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中优先采用的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码。

UTF-8使用一至四个字节为每个字符编码:

unicode是字符集,UTF-8是这一字符集的编码方式。

  • 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
  • n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。 这样就形成了如下的UTF-8标记位:
    • 0xxxxxxx
    • 110xxxxx 10xxxxxx
    • 1110xxxx 10xxxxxx 10xxxxxx
    • 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
    • 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
    • 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

最终,人类通过unicode建立了计算机世界的巴别塔。

字符编码:计算机的巴别塔相关推荐

  1. 2022-03-03 北京 计算机知识。字符编码,ppt

    字符编码: 存储汉字的时候,用的编码方式不一致.汉字所占用的字节数也就不相同. 在GBK字符编码下,一个汉字占用2个字节.而在utf-8编码下,一个汉字占用3个字节. 从硬件角度来看计算机: 计算机就 ...

  2. java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**

    原文出处:http://cmsblogs.com/?p=1412 在上篇博文(java中文乱码解决之道(一)-–认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述 ...

  3. 字符编码在python中的处理与储存_python----字符编码与文件处理

    字符编码 计算机工作就要通电,也就是说'电'驱使计算机干活,而电只有高电压(二进制1),低电压(二进制0),也就是说计算机只认数字. 编程的目的就是让计算机干活,编程的结果就是一堆字符,也就是我们编程 ...

  4. js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind

    数组方法.字符串方法总结 大目录 小目录 一.ES5严格模式 1. 严格模式: 2. 严格模式的行为变更: 二.ES5新增的数组的方法 1. 判断是否为数组:Array.isArray(): 2. 判 ...

  5. python默认采用什么字符编码_Python01.2.字符编码-输入输出

    1.字符编码 计算机存储的任何数据,包括各种文本.图片.音视频文件等等,实际上都是一串二进制数字01字节序列组成的.一个字节Byte(B)是8个比特bit(b).而字符,自然就是符号了.比如说二十六个 ...

  6. Python基础知识(二进制与字符编码、Python中的标识符和保留字、变量的定义和使用、变量的多次赋值)

    6.二进制与字符编码 什么叫二进制与字符编码 计算机是由逻辑电路组成的,逻辑电路也有两种状态开和关 可以用0和1表示 如图 :一个位置上你可以写上0或者1,如果还想有更多的状态 可以加位置 可以0或者 ...

  7. 计算机字符编码详尽讲解

    文章来源:http://www.guokr.com/blog/763017/ 下载一个文档,一打开发现是乱码,不抓狂才怪--你们都知道,这都是字符编码闯的祸.ASCII.ANSI.GB18030.Un ...

  8. 计算机应用最普遍的汉字字符编码是什么,计算机中目前最普遍使用的汉字字符编码是什么...

    计算机中目前最普遍使用的汉字字符编码是ASCII码,它是用七位二进制数进行编码的,可表示128个字符.ASCII码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言. 计算机中目前最 ...

  9. 计算机应用最普遍的汉字字符编码是什么,什么是计算机中应用最普遍的字符编码...

    什么是计算机中应用最普遍的字符编码 发布时间:2020-08-07 11:15:28 来源:亿速云 阅读:127 作者:Leah 什么是计算机中应用最普遍的字符编码?针对这个问题,这篇文章详细介绍了相 ...

最新文章

  1. FPGA的设计艺术(8)最佳的FPGA开发实践之严格遵循过程
  2. android运行jar文件路径,java命令行执行jar包报错解决
  3. SVN switch 用法详解
  4. java ee13_一口气了解多线程及其Java实现
  5. mysql空洞数据,Mysql 表空间和 数据页空洞
  6. Android万能遥控菜单选择添加,Android万能遥控器小应用
  7. 一图梳理企业数据治理的8项举措
  8. CAS单点登陆原理简介及环境搭建
  9. jdk1.5的类转换成jdk1.4的类文件
  10. 58天 -算法 openJudge百炼 2787-凑24 - 递归
  11. 线性表之顺序存储,基本操作
  12. asp.net伪静态配置
  13. python之深浅copy与id
  14. Android edittext 属性inputtype
  15. 在windows系统上搭建CTS测试环境过程记录
  16. 2-10-Mysql认实和搭建LAMP环境部署Ucenter和Ucenter-home网站
  17. layui.css地址,layui+高德获取经纬度(可点击更换位置)
  18. 高德地图定位的简单实现
  19. AirSim在Windows下环境搭建
  20. Weight the Tree CodeForces - 1646D

热门文章

  1. JavaScript 整分或者指定时间执行操作
  2. 蚂蚁金服分布式事务框架DTX源码学习
  3. 转一篇Decorator模式的讲解文章
  4. 剑指offer: 二叉树中和为某一值的路径
  5. sketch mac版设置快捷键的小技巧
  6. 2020年2月中国编程语言排行榜
  7. 推动人工智能教育发展,创新学校高质量发展模式
  8. 软件开发工程师进阶之路(一)
  9. IT中高端人才招聘技巧
  10. 我给鸿星尔克写了一个720°看鞋展厅