首发于 字符编码:计算机的巴别塔html
巴别塔:《圣经·旧约·创世记》第11章宣称,当时人类联合起来兴建但愿能通往天堂的高塔;为了阻止人类的计划,上帝让人类说不一样的语言,令人类相互之间不能沟通,计划所以失败,人类自此各散东西。此故事试图为世上出现不一样语言和种族提供解释。
咱们曾经在HTTP
的响应头中见到过Content-Type:text/html; charset=utf-8
,也曾在HTML
文件中见到过<meta charset="utf-8">
。它们都是用于声明字符编码为utf-8
。那么utf-8
究竟是什么?这要从计算机的起源提及。网络
最先的计算机是机械式继电器计算机,经过继电器的开关状态来表示0和1。后来的电子管计算机、晶体管计算机、集成电路计算机都继承了这一设定,这也是为何计算机以二进制来存储数据。编码
人类发明计算机的目的是处理数据,而绝大多数数据都是文本形式的,因此要把这些文本转换为计算机可识别的二进制数据,再把计算机处理过的二进制数据转换为人类可识别的文本。这个二进制和文本的对照表就是字符集。.net
美国人发明了最先的现代计算机。因此美国人最初制定了ASCII
(American Standard Code for Information Interchange,美国信息互换标准代码)来保存控制码、空格、标点符号、数字、大小写字母。计算机的一个字节能够组合出2^8种不一样的状态。 ASCII
使用了128个状态。code
编号从0开始的32种状态分别规定了特殊的用途,这些0×20如下的字节状态称为”控制码”。
随着世界各地的不一样国家开始使用计算机,为了能够在计算机中使用ASCII
中没有制定的文字,在128至255号以后的状态来表示这些新的字母、符号。这些字符集被称“扩展字符集”。orm
ASCII
中是没有汉字的,而经常使用简体汉字就有几千个。因此中国制定了GB2312
(GB是国标的拼音缩写)。GB2312
规定:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一块儿时,就表示一个汉字。GB2312
收录了6763个经常使用汉字。这也是为何在之前一个汉字算两个英文字符的缘由。htm
可是汉字有那么多,GB2312
中并不包含生僻字,因此仍是须要扩展。扩展以后的编码方案被称为GBK
标准,GBK
包括了GB2312
的全部内容,同时又增长了近20000个新的汉字(包括繁体字)和符号。继承
当时同文同种的港台同胞们也制定一套编码标准BIG5
,这套标准和GB2312/GBK
并不兼容。而世界各地其余国家也制定了本身的标准。虽然本地使用没有问题,然而在网络中因为字符集不兼容,你们谁也看不懂别人的编码,互相访问就会出现乱码。咱们仿佛进入了巴别塔被摧毁后的世界。ip
为解决这个问题,ISO
(国际标谁化组织)制定了通用字符集:“Universal Multiple-Octet Coded Character Set”,简称UCS
,又称unicode
。utf-8
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
(8-bit Unicode Transformation Format)是一种针对unicode
的可变长度字符编码。它能够用来表示unicode
标准中的任何字符,且其编码中的第一个字节仍与ASCII
兼容,这使得原来处理ASCII
字符的软件无须或只须作少部份修改,便可继续使用。所以,它逐渐成为电子邮件、网页及其余存储或传送文字的应用中优先采用的编码。互联网工程工做小组(IETF)要求全部互联网协议都必须支持UTF-8
编码。
UTF-8使用一至四个字节为每一个字符编码:
unicode
是字符集,UTF-8
是这一字符集的编码方式。
UTF-8
码只占用一个字节,和ASCII
码彻底相同;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
创建了计算机世界的巴别塔。