快速理解ASCII、GBK、Unicode、UTF-8、ANSI

发布时间 2023-12-29 17:53:17作者: 小松聊PHP进阶

文章大部分内容来源于非官方说明,且无法用逻辑推理出结果,准确性仅供参考。

ASCII

计算机是老外发明的,想让计算机实现更多的功能,必然少不了把常用的字母和符号存进去,甚至包含一些特殊符号,于是ASCII码,American Standard Code for Information Interchange就这样诞生了,它一共256(原先128个,后期又新增到256个)个字符,2^8=256,所以刚好一个字节可以存储的下。

GBK

随着计算机流入中国,ASCII无法满足汉字的需求,于是GBK2312诞生了,但是发现GB2312不够强大,于是GBK诞生了,它包含了 GB2312 字符集中的全部 6763 个汉字,以及其它汉字、拉丁字母、符号和其他特殊字符。因此,总体而言,GBK 编码共包含了21886 个字符,由于2^16>>211886,所以用两个字节存储足够了,这就是一个GBK字符编码的汉字,占2个字节大小的原因,但英文字符仍旧占1个字节。

Unicode

每个国家都搞自己的编码,那么不同国家之间的信息传递就会有乱码的情况,unicode就是为了解决这个问题的,起初是utf-32,蕴含着有容乃大的思想,任何字符都占用4个字节,但是很多人觉得造成了空间浪费,流量传输浪费问题。

UTF-8

为了空间浪费的问题,UTF-8诞生了,utf-8采用的是可变长度,也就是英文字符1个字节(兼容了ASCII),汉字3个字节,表情符号4个字节来表示。这会诞生一个问题,解析软件怎么区分需要解析1-4是几个字节的,那么就制定了一个规范:

  • 占用1个字节的字符:二进制编码以0开头。
  • 占用2个字节的字符:第一个字节以110开头,第二个字节以10开头。
  • 占用3个字节的字符:第一个字节以1110开头,第二个字节以10开头,第三个字节以10开头。
  • 占用4个字节的字符:第一个字节以11110开头,第二个字节以10开头,第三个字节以10开头,第四个字节以10开头。

ANSI

这个在Windows记事本下有这个,ANSI 编码是一种由美国国家标准协会(ANSI)制定的编码标准,主要用于英语和其他西欧语言的编码。实际上,ANSI编码是一个众多编码的集合,它并没有明确的定义,不同程序和系统对其理解和实现也不完全相同。

UTF-16

UTF-16 是一种采用 16 位编码的 Unicode 字符编码方式,它是 Unicode 标准的一部分,可以表示全部的 Unicode 字符集范围(而 UTF-8 和 UTF-7 只能部分表示,所以存在兼容性问题)。
虽然 UTF-16 具有可移植性和编码效率高等优点,但是由于它使用的是 16 位编码,因此会占用更多的存储空间,而且在零散的文本处理和传输过程中,需要更多的字节数。。因为和UTF-32一样因存储问题,而没有成为主流。

UTF-16LE

UTF-16和UTF-16LE都是Unicode字符编码的实现方式,其中的“LE”指的是“Little Endian”,表示低字节顺序,而没有“LE”则默认为高字节序。
UTF-16编码采用16位(两个字节)来表示一个Unicode字符,因此每个字符的存储需要占用两个字节,从而可能导致存储和传输效率低下的问题。UTF-16还支持BOM(Byte Order Mark)来标识字节序列的顺序。
UTF-16LE也是UTF-16的一种变体,它采用Little Endian字节序来存储每个字符的两个字节。这种字节序在Intel和AMD等主流计算机中应用广泛。与UTF-16BE(Big Endian)相比,UTF-16LE在内存存储和网络传输时占用的字节顺序更经济,因此它通常用于Windows及其他操作系统和软件中。

GBK与GB2312

GBK是GB2312的升级版,GBK编码在GB2312的基础上又增加了14240个汉字、生僻字等。按照GB2312的编码方式,两个字节已经不够用了,这时候GBK编码制定了新标准:只要出现一个大于127(0x7F)的字节,那么这个字节和它后面的一个字节共两个字节表示一个汉字,这样做的好处是可以同时兼容ASCII和GB2312。

Big5

Big5,又称为大五码或五大码,是使用繁体中文(正体中文)社区中最常用的电脑汉字字符集标准,共收录13,060个汉字。
中文码分为内码及交换码两类,Big5属中文内码,知名的中文交换码有CCCII、CNS11643。
Big5虽普及于台湾、香港与澳门等繁体中文通行区,但长期以来并非当地的国家/地区标准或官方标准,而只是业界标准。
Big5码是一套双字节字符集,使用了双八码存储方法,以两个字节来安放一个字。第一个字节称为“高位字节”,第二个字节称为“低位字节”。

MySQL中utf8与utf8mb4

utf8:在早期的 MySQL 版本中,utf8 是用来存储 Unicode 字符的字符集,但它只支持最多三个字节的字符编码范围,无法存储表情符号,因此不是真正的utf-8。
utf8mb4:为了解决 utf8 的不足而引入了 utf8mb4 字符集。utf8mb4 支持最多四个字节的字符编码范围,可以表示更广泛的 Unicode 字符,包括一些特殊表情符号(如 Emoji)等,所以推荐使用

MySQL中utf8mb4_general_ci与utf8mb4_unicode_ci

ci表示不区分大小写。
utf8mb4_general_ci 是一种基于字符串二进制的简单排序规则,它不会考虑字符的语言或文化背景,只会判断字符的字节值大小。比如它认为 ‘a’ 和 ‘A’ 是相等的,认为 ‘ä’ 和 ‘a’ 也是相等的。
utf8mb4_unicode_ci 也支持 Unicode 编码,但排序规则更加智能化,把字符进行了分组,分别考虑了字符的语言、文化背景和排序规则。比如它认为 ‘a’ 与 ‘A’ 不同,认为 ‘ä’ 与 ‘a’ 不同,但它会把类似于 ‘ä’、‘ö’、‘ü’ 这样的字符分到一组,并认为它们相等。
综上所述,如果需要对字符的语言、文化背景和排序规则进行精确的排序和比较,建议使用 utf8mb4_unicode_ci。

latin-1、latin-2

用于表示拉丁字母字符和其他特殊字符。它最初是为了表示欧洲语言而设计的,但后来也被广泛用于其他地区和语言。
其中,最常见的 Latin 编码标准有 Latin-1(ISO-8859-1)和 Latin-2(ISO-8859-2)。
Latin-1 编码涵盖了西欧语言(如英语、法语、德语、西班牙语等)中的基本拉丁字母字符以及一些特殊字符和符号。
Latin-2 编码扩展了 Latin-1,覆盖了中欧语言(如捷克语、波兰语、匈牙利语等)中的字符。

BOM

BOM(Byte Order Mark)是一个特殊的字符序列,用于表示文本数据的字节顺序(即大端序或小端序)。它通常作为文本文件的开头几个字节出现。
BOM 在处理文本文件时具有重要作用,它可以帮助确定文本数据的正确编码方式,从而正确解析和显示文本内容。