字符编码

位:bit(Binary digit 二进制数字),是信息的最小单位。0 和 1 。
字节:byte,简写 B,通常用作计算机信息计量单位,不分数据类型。1 byte 可以区分 2^8 的数字,即(0 - 255)。1 byte = 8 bit,1 KB = 1024 byte,1 MB = 1024 KB ,1 GB = 1024 MB 。

字符:在计算机和电信技术中,一个字符是一个单位的字形、类字形单位或符号的基本信息。在 ASCII 编码中,一个英文字母字符存储需要1个字节。在 GB2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。

字符集:只是一个规则集合的名字。对于一个字符集来说要正确编码转码一个字符需要三个关键元素:字库表、编码字符集、字符编码。

  • 字库表
    是一个相当于所有可读或者可显示字符的数据库,字库表决定了整个字符集能够展现表示的所有字符的范围。
  • 编码字符集
    是指用一个编码值 code point 来表示一个字符在字库中的位置。如 ASCII码、GBXXXX字符集、Unicode
  • 字符编码
    将编码字符集和实际存储数值之间的转换关系。如 ASCII编码、GBXXXX编码、UTF-8

ASCII

ASCII 是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。

ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。

分类:

  • 标准 ASCII 码
    也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

    • 0~31及127(共33个)
      控制字符或通信专用字符(其余为可显示字符)。

    • 32~126(共95个)
      字符(32是空格)。其中48~57为0到9十个阿拉伯数字。
      65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

  • 扩展 ASCII 码
    后128个。扩展ASCII 码允许将每个字符的第8 位用于确定附加的128 个特殊符号字符、外来语字母和图形符号。

Unicode

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码实现方式。

Unicode 的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。UTF-8、UTF-16、UTF-32都是将数字转换到程序数据的编码方案。

Unicode 中汉字域为>=0x4e00并且<=0x9fa5

1
2
3
4
5
6
// js 中与 Unicode 有关的处理
String.fromCharCode() // 通过一串 Unicode 创建字符串
String.prototype.charCodeAt() // 返回表示给定索引的字符的 Unicode 的值
/[\u4E00-\u9FFF]/.test(str) // 判断 str 是否存在汉字

UTF-8

UTF-8 是一种针对Unicode的可变长度字符编码.

UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8 的编码规则:

  • 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的 Unicode 码。因此对于英语字母,UTF-8 编码和 ASCII 码是相同的。

  • 对于n字节的符号(n > 1),第一个字节的前n位都设为1,第n + 1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。

GBXXXX

GBXXXX 是为了转换汉字的字符编码。

GB2312

GB2312 或 GB2312–80 是中华人民共和国国家标准简体中文字符集,全称《信息交换用汉字编码字符集·基本集》,通常简称GB,又称GB0,由中国国家标准总局发布,1981年5月1日实施。

GB2312 的编码规则:

  • 小于 127 的字节的意义与 ASCII 码相同。
  • 两个大于 127 的字节连在一起就表示一个汉字。前面的一个字节称为高字节,范围为 0xA1 到 0xF7;后面的一个字节称为低字节,范围为 0xA1 到 0xFE 。可以组合出大约 7000 多个简体汉字。在这些编码里,还把数学符号、罗马希腊的 字母、日文的假名们都编进去了,连在 ASCII 码里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的”全角”字符,而原来在127号以下的那些就叫”半角”字符。

GBK

GBK全称《汉字内码扩展规范》,中华人民共和国全国信息技术标准化技术委员会1995年12月1日制订,国家技术监督局标准化司、电子工业部科技与质量监督司1995年12月15日联合以技监标函1995 229号文件的形式,将它确定为技术规范指导性文件。

GBK 向下与 GB2312 编码兼容,向上支持 ISO10646.1国际标准。GBK共收录 21886 个汉字和图形符号。

GBK 与 GB2312 编码规则类似,但 GBK 的低字节范围在 0x40 到 0x7E、0x80 到 0xFE 这两个范围中。