likes
comments
collection
share

字符集之ASCII、GB2312、BGK 、Unicode、UTF-8 编码入门

作者站长头像
站长
· 阅读数 82

众所周知网页的本质是 html。 那么为了正确的显示HTML页面, 浏览器必须知道使用的字符集。

那什么是字符集呢? 相信你肯定见过页面中的乱码现象。那么为什么会有乱码呢? 那你首先要知道什么是编码,什么是解码。 计算机能识别的语言是什么?

一些基础概念:

  • 比特(bits):计算机最小的存储单位,也就是一个二进制位,只有01 两种状态
  • 字节(byte):一个字节有8比特
  • 二进制:只有01两种数码,进位规则是 逢2进1
  • 十进制:-
  • 十六进制:0x
  • 编码:从一种形式转换成另一种形式
  • 解码:编码的逆过程
  • 乱码:即指定的两种编码方式不兼容,编码转换时出现解析错误

计算机数据以二进制代码(01000101)存储在电子设备中。

字符集的历史:

计算机最开始是诞生于美国,所以最早的编码里没有中文。正常一个字节有8位, 最多就能表示256个字符, 但是因为英文比较少, 所以只占用了7位。也就是128个字符。

1. ASCII 编码 :基础编码

全称:American Standard Code for Information Interchange(美国信息交换标准代码)。

计算机最早发展于美国,ASCII 是 Internet 上计算机之间使用的第一个字符集(编码标准)。目前仍在使用。

后来的 ISO-8859-1(HTML 4.01 中默认)和 UTF-8(HTML5 中默认)都是基于 ASCII 构建的。

时间:是在 20 世纪 60 年代初设计的,是计算机和电子设备的标准字符集。

编码长度:是单字节编码。

编码空间:0x00-0x7f,ASCII 使用 7 位,因此它只能表示 2^7 128 个不同的字符。

  • 它包含从 0-9 的数字,从 A 到 Z 的大写和小写英文字母以及一些特殊字符(<>等)。
  • 0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),不可打印

缺点: 排除了非英文字母(不支持中文,日语等其他语言)

字母十进制二进制
a9701100001

那么由于 ASCII 不支持汉语,所以当其他国家的计算机发展起来后, 就发现这个字符集不够用了。 就有了各种基于ASCII的扩展。


2. ANSI 编码:

ANSI是一种字符代码,为使计算机支持更多语言。表示范围如下:

范围十进制范围表示
0x00~0x7f0~1271个英文字符(即基础ASCII)
0x80~0xFFFF128~65535扩展的ASCII编码(包括中文)

定义:不同的国家和地区制定了不同的标准,由此产生了 GB2312、GBK、GB18030、Big5、Shift_JIS 等各自的编码标准。这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称为 ANSI 编码。 ANSI 并不特指某一个编码,只是一个泛称。

  • 在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码;
  • 在繁体中文Windows操作系统中,ANSI编码代表Big5;
  • 在日文Windows操作系统中,ANSI 编码代表 JIS 编码。

ANSI: 美国国家标准学会(American National Standard Institute)

ISO:国际标准化组织(International Organization for Standardization)成立于1947年,是标准化领域中的一个国际组织,该组织自我定义为[非政府组织]。[官方语言]是英语、法语和俄语,中国于1978年加入。ISO的主要功能是为人们制订国际标准达成一致意见提供一种机制。制定的标准不仅仅是针对计算机领域,还包含农业、交通、环境等其他领域。总部在欧洲的瑞士日内瓦

2.1 ISO-8859-n 系列

随着普及, 计算机传到了欧洲,于是国际标准化组织(ISO)及国际电工委员会(IEC)决定联合制定另一套字符集标准。因为ASCII 使用了7位, 也就是说一个字节(8位)的最高位没有被使用,所以欧洲人就使用了最高位字节,从此 这128-255 就被西欧常用字符占用了。于是 ISO-8859-1 字符集就诞生了。

2.1.1 ISO-8859-1: 【HTML4.01 默认字符集】

  • 编码长度: 单字节编码
  • 限制: 定义最多95个字符
  • 特性:其码位都在 0xA1 -- 0xFF(161-255)

解释:因为128-159(共33个)未被定义,所以最多可以使用字符256(8位总共能存储的字符个数)-128(基础ASCII已经占用的)-33(未定义的)= 95个,所以对应的来说,码位就在能定义的160-255之间 也就是0xA1 -- 0xFF。

随着时间的推移,越来越多的欧洲国家需要字符编码,所以就衍生了 1-16 不同的变体。

2.2 windows-1252:Microsoft Windows 中的第一个默认字符集

时间:从 1985 年到 1990 年,它是 Windows 中最流行的字符集。

Windows-1252 与 ISO-8859-1 非常相似。他们的第一部分(实体编号为 0-127)都是原始的 ASCII 字符集(向下兼容ASCII的)。 区别:在 ISO-8859-1 中,未定义 128 到 159 之间的字符。 但在 Windows-1252 中,从 12 8到 159 的字符用于某些有用的符号【比如晚出现的欧元符号】。

但是由于许多网站都声明 ISO-8859-1 并使用从 128 到 159 的值,就好像它们使用的是 Windows-1252 一样,大多数浏览器将显示 Windows-1252 字符集中的这些字符

尽管 Windows-1252 与 ISO-8859-1 几乎相同,但它从未成为 ANSI 或 ISO 标准。

2.3 GB2312: 第一个中文字符集

计算机普及到中国以及亚太地区的时候。

背景:一个字节的8位已经都被占用了,于是等到了中国这里,只能扩展一个,使用2个字节表示中文。

时间: 1980年发布

编码长度:汉字固定两个字节,每个字节的最高位为1,如果是0 就认为是ASCII字符。

编码空间:在这两个字节中,其中高位字节范围是0xA1~0xF7,低位字节范围是0xA1~0xFE。

收录字数:GB2312 编码收录了常用的汉字 6763 个和非汉字图形字符 682 (包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的全角字符)个。GB 2312的出现,基本满足了汉字的计算机处理需要,它所收录的汉字已经覆盖中国大陆99.75%的使用频率

兼容: 不兼容 ISO-8859-n 编码集,但是兼容 ASCII 编码。

缺点: 对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,所以出现了GBK和GB 18030

如何识别中文

中文的双字节字符都从 128 之后开始,也就是当发现字符连续两位都大于 128 时,就说明这是一个中文。

2.4 GBK:扩展(繁体字,生僻字也收录)

时间: 1995年发布

编码长度:单双字节变长编码,汉字固定2字节,高位字节的最高位是1

编码空间: 0x8140~0xFEFE,共有 23940 个码位

收录字数:兼容GB2312—1980,同时在字汇一级支持ISO/IEC10646—1和GB13000—1的全部中、日、韩(CJK)汉字,共计20902字。

兼容 :向下兼容了GB2312

缺点:2个字节最多可以有256*256 = 65536个字符,还是不太够,为了包含更多的字符,出现了GB18030,包括更多的少数民族以及日韩等地的文字。

如何识别中文

因为汉字是用固定两个字节表示的,在解析二进制流的时候,如果第一个字节的最高位为1,那么就将下一个字节读进来一起解析为一个汉字,而不用考虑它的最高位,解析完后,跳到第三个字节继续解析。

2.5 GB18030:可变

时间:2000 发布

是否可变:变长编码,可能是2个字节, 也可能是4个字节

收录字数:包含多种少数民族文字等,共70000 余个。

兼容 :向下兼容了GBK

如何识别中文

看第二个字节的范围,如果是0x30~0x39就是4个字节表示。 因为2个字节的第二位字节编码是从0x40开始的。比这个大

2.6 Big5 :

是针对繁体中文的,广泛用于我国台湾地区和我国香港特别行政区等地。

时间: 1984发布

编码长度:固定2字节

Big5码的产生,是因为当时台湾不同厂商各自推出不同的编码,彼此不能兼容;另一方面,台湾当局当时尚未推出官方的汉字编码,而中国大陆的GB2312编码亦未有收录繁体中文字。


总之:设计出这么多东西的目的只有一个,制定一套标准。但是每个国家虽然有了自己的编码标准,但计算机厂商都只考虑了自己国家甚至自己厂商的字符和编码,导致出现了太多的编码且相互不兼容,彼此不认识就会发生所谓的乱码。因此出现了unicode。

3. Unicode(万国码) 字符集

Unicode 给世界上所有的字符都分配了一个唯一的数字编号,这个数字编号一般写成16进制,在前面加U+.

时间: 1992 发布1.0.1

UCS: 通用字符集

是由[ISO]制定的ISO 10646标准所定义的标准字符集。有ucs-2 和ucs-4。

UTF-n 编码:对Unicode 字符集的具体实现

UTF(Unicode Tranformation Format)

编码占用字节数缺点使用
UTF-32固定4个浪费
UTF-162个字节或者4个字节英文还是浪费
UTF-8变长编码多字节需要经历一次转换HTML5默认字符集

UTF-8是兼容ASCII码,对于大部分中文而言,一个中文字符需要用三个字节来表示

unicode 是基于UCS 的,历史上2个组织都尝试创立统一的字符集,最后两人达成一致,不需要2个统一的字符集,最后合并了。Unicode 2.0开始,Unicode采用了与ISO 10646-1相同的字库和字码


对照表:

十进制十六进制二进制
00x000000 0000
1270x7f0111 1111
1280x801000 0000
1290x811000 0001
1590x9f1001 1111
1600xA01010 0000
1610xA11010 0001
2470xf71111 0111
2540xfe1111 1110
2550xff1111 1111

总结:

总结来说,字符集有最基础的单字节编码ASCII,以及后来的扩展ACSII。需要进行扩展的原因是因为ACSII仅使用单字节的7位,共128个字符,不足以表示所有的字符(欧元、中文等)。扩展ASCII都是向下兼容ASCII的。西欧国家扩展了单字节的最高位,而后面出现的多字节的GB2312,GBK,BIG5等都是使用的双字节,GB18030扩展到2字节、4字节。

但是即便各自有了编码,在同一个ASNI中,两种编码互不兼容,所以出现了Unicode编码,用来实现统一,他是基于UCS(另一个统一字符的组织研发的,后来合并了)。Unicode只是一种编码方案,具体的实现就是有UTF-8,UTF-16,UTF-32 三种具体的编码实现。UTF-8 是优先使用的方案。

附表一张:

字符集0-31 + 1270-127128-159160-255>256
ASCII控制字符数字、字母、特殊符号不使用不使用不使用
window-1252(ANSI)同ASCII同ASCII专有的字符同UTF-8不使用
iso-8859-1同ASCII同ASCII不使用同UTF-8不使用
UTF-8同ASCII同ASCII不使用同ANSI 和 8859-1包含超过10000个字符
转载自:https://juejin.cn/post/7206228205819609143
评论
请登录