字符编码历程

date
Mar 28, 2022
slug
char-encode
status
Published
tags
基础知识
summary
重新梳理和记录字符编码相关的内容。
type
Post
  • 名词解释
    • ASCII: American Standard Code for Information Interchange 美国信息交换标准代码
    • Unicode: 统一码、万国码
    • UTF-8: 8-bit Unicode Transformation Format 针对 Unicode 的可变长度字符编码
    • 字符集: 字符(文字、标点符号、数字等)的集合
    • 编码: 将字符集转换为二进制码
    • 解码: 将二进制转换为字符
 
计算机的最小存储单元为二进制位,只能存储 0 或 1,用来存储人类的符号就需要一层 映射关系
 
映射关系最初使用的 ASCII 单字节 编码规则,但由于计算机的普及,单字节字符映射的 数量 以无法满足需求。
 
后来中国发布了一套有关汉字字符集编码 GB-2312-1980 , 用俩个字节对字符进行编码,并兼容 ASCII
 
但每个国家都为自己的语言制定字符集编码时,当装有不同编码系统的计算机之间通信就会 乱码 现象。
 
为了解决 乱码 问题,ISO 国际标准化组织提出 Unicode 字符集编码的新标准,该标准涵盖了世界上 所有 的文字和符号,也就是每一个字符都有一个唯一的二进制编码。
 
那么 UTF-8、UTF-16 编码方案又是什么呢?首先要区分 现代五层编码模型 中的俩个重要概念:
  • 字符代码:字符在字符集中的 序号
  • 字符编码:字符在磁盘中的二进制 比特序列
比如字符 A 在 ASCII 编码中的的 字符代码 为 65,在 字符编码 中是 01000001 十进制也是 65,在 GB2312 中俩者也是一致的。
 
但在 Unicode 中使用的 UCS-4 ,每个字符都是用 4 个字节来表示,如果还是采用上述一相致的编码方式,则会造成储存资源的浪费,因此需要在 字符代码和字符编码间进行再编码UTF-8 就是针对 不同范围 的字符代码转化成 不同长度 的字符编码,同时编码也是以字节为单位储存,而 UTF-16 的区别在于的 二进制位数,比如 A 在 UTF-8 可变长编码后存储一个字节就可以表示,在 UTF-16 编码下就需要俩个字节。
 
总结:在全球互联大背景下,Unicode 字符集和编码方式解决了跨语言、跨平台的交流问题,同时 UTF-8 等编码又有效的节约了 储存空间 传输带宽,因为此受到了极大的推广和应用。
 
flowchart TD
UTF[UTF-8/UTF-16 可变长编码]
ASCII[ASCII 英文编码]
ISO8859[ISO 国际标准化组织]
Unicode[Unicode 统一码]
subgraph 字符编码发展史
  ASCII --> chinese
	ASCII --> other
	chinese --> ISO8859
	other --> ISO8859
	ISO8859 --> Unicode
	Unicode --> UTF
end
subgraph chinese[中文编码]
	GB2372
	GBK
	GB78030
end
subgraph other[其他语言编码]
	...
end
 
问题:为什么有些字符长度为 2 ?
由于 JS 字符串是 UTF-16变长编码 的字符串,一个字符串可能用 1 个或 2 个 16bit 来表示一个字符串,也就是使用 UTF-16 编码所用的 16bit 所占用的 个数 等于该字符串的 长度
 
 

© jianxiaoBai 2021 - 2024